home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Freeware / Remapollo / Modules / HappyENV-Handler.asm < prev    next >
Encoding:
Assembly Source File  |  2002-10-27  |  56.4 KB  |  2,856 lines

  1. *************************
  2. *   HappyENV-Handler    *
  3. *     1.0 05.06.97    *
  4. *  (C) Martin Gierich    *
  5. *************************
  6.  
  7. * MM's fixes:
  8.  
  9. * 1.0a
  10. *
  11. * - fixed ACTION_SET_FILE_SIZE packet
  12. * - fixed ACTION_SAME_LOCK packet (circular entry error)
  13. * - fixed NULL lock (ENVARC: assigned to root)
  14. * - added ROMTAG structure
  15. * - support for KS 1.3 removed
  16. * - startup parms for resident operation are hardcoded into data section
  17. * - workaround for some dependencies in notification support; noti is a real
  18. *   mess in AmigaOS
  19.  
  20. * 1.3
  21. *
  22. * - added support for date
  23. * - fixed ACTION_COPY_DIR with ZERO lock
  24. * - removed hidden files mechanism
  25. * - increased max path to 255 chars
  26. * - cleaned up startup/die routines
  27. * - fixed nasty bug in CalcFullName routine
  28. * - fixed assigns
  29. * - added protection bits (lowest byte only)
  30.  
  31.  
  32. * Do not use this source code or parts of it in other programs !
  33. * See documentation about Copyright&Disclaimer.
  34. * Sorry about the not so well commented source.
  35.  
  36.  
  37. * Switches for options, enabled if label is defined,
  38. * disabled if semicolon is put in front of it.
  39.  
  40. ;DEBUG        = 1    ;allow debugging output via sushi (RawPutChar)
  41. ;VERBOSE    = 1    ;verbose debug output
  42. ;EXPAND        = 1
  43.  
  44. ;test=1    set for test, non-public versions
  45. ;rom=1    set if build for 3.x-like ROM image (TaggedOpen)
  46.  
  47.     mc68000
  48.  
  49. fdate    macro
  50.     dc.b    '27.6.2002'
  51.     endm
  52. $VER    macro
  53.     dc.b    '1.3'
  54.     endm
  55.  
  56.     include lvos
  57.     INCLUDE    dos/dosextens.i
  58.     INCLUDE    dos/dostags.i
  59.     include    exec/memory.i
  60.     include    exec/tasks.i
  61.     include    exec/ports.i
  62.     include    exec/semaphores.i
  63.     include    exec/resident.i
  64.     INCLUDE    dos/filehandler.i
  65.     INCLUDE    dos/notify.i
  66.     INCLUDE    dos/rdargs.i
  67.     ifd    DEBUG
  68.     INCLUDE DH1:Actual/Trashcan/HappyENV/Source/debug.i
  69.     endc
  70.  
  71. * other macros
  72. * compare both operands and store minimum in the right one
  73. * third argument is label name
  74.  
  75. MIN    MACRO
  76.     cmp.l    \2,\1
  77.     bhs.s    .\3
  78.     move.l    \1,\2
  79. .\3
  80.     ENDM
  81.  
  82. * miscellaneous definitions
  83.  
  84. LF        = 10
  85. MAXNAME        = 36    (32 + terminating 0 + longword alignment)
  86. MAXPATH        = 256-MAXNAME
  87. BLOCKSIZE    = 5000
  88.  
  89.     IFND    DEBUG
  90. DBUG5    MACRO
  91.     ENDM
  92. DBUG4    MACRO
  93.     ENDM
  94. DBUG3    MACRO
  95.     ENDM
  96. DBUG2    MACRO
  97.     ENDM
  98. DBUG1    MACRO
  99.     ENDM
  100. DBUG0    MACRO
  101.     ENDM
  102.     ENDC
  103.  
  104. * EasyRequest structure (Intuition)
  105.         RSRESET
  106. es_StructSize    RS.L    1
  107. es_Flags    RS.L    1
  108. es_Title    RS.L    1
  109. es_TextFormat    RS.L    1
  110. es_GadgetFormat    RS.L    1
  111. es_SIZEOF    RS.W    0
  112.  
  113.  
  114. * notify list node structure
  115.         RSRESET
  116. myn_Link    RS.L    1
  117. myn_Request    RS.L    1    ;notify-request
  118. myn_Key        RS.L    1    ;pointer to file
  119. myn_Name    RS.B    0    ;path/file name (dynamic)
  120.  
  121. * lock structure for Lock() and open files
  122.  
  123. * when changing anything here, remember to fix CreateLock! -MM
  124.  
  125.         RSRESET
  126. myl_Link    RS.L    1
  127. myl_Key        RS.L    1
  128. myl_Access    RS.L    1
  129. myl_Task    RS.L    1
  130. myl_Volume    RS.L    1
  131. myl_Pos        RS.L    1    ;position in file (read/write)
  132. myl_Data    RS.L    1    ;start of file data (read)
  133. myl_Start    RS.L    1    ;start of block list (write)
  134. myl_Block    RS.L    1    ;current block (write)
  135. myl_BlockPos    RS.L    1    ;position in current block (write)
  136. myl_Size    RS.L    1    ;size of file
  137. myl_Mode    RS.B    1    ;0=simple lock, -1=write, 1=read
  138. myl_Pad        RS.B    1
  139. myl_SIZEOF    RS.W    0
  140.  
  141. * structure for file or dir
  142.         RSRESET
  143. myf_Link    RS.L    1    ;next file/dir
  144. myf_Parent    RS.L    1    ;parent dir (root: 0)
  145. myf_First    RS.L    0    ;dir:  points to first entry
  146. myf_Size    RS.L    1    ;file: size of filedata
  147. myf_Date    rs.l    3    ;datestamp
  148. myf_Attrs    rs.b    1    ;attributes
  149. myf_Type    RS.B    1    ;bit7: dir/file, [6:hidden (removed -MM)],
  150.                 ;5:copied, 4:notify, 3:modified
  151. myf_Locks    RS.B    1    ;number of locks, -1=write lock
  152. myf_DataOffs    RS.B    1    ;offset to start of data
  153. myf_Name    RS.B    0    ;name (dynamic), then data
  154.  
  155. * private main structure
  156.         RSRESET
  157. CharTable    RS.B    256
  158. ExecBase    rs.l    1
  159. DosBase        RS.L    1
  160. IntuiBase    RS.L    1
  161. MyProcess    RS.L    1
  162. MyMsgPort    RS.L    1
  163. MyMemPool    RS.L    1
  164. MyDeviceNode    RS.L    1
  165. MyVolumeBPTR    RS.L    1
  166. NotifyList    RS.L    1
  167. ;Copyfrom    RS.L    1
  168. ;CopyfromLock    RS.L    1
  169. ;CopyfromPort    RS.L    1
  170. ;EnvarcLock    rs.l    1
  171. RootLock    RS.L    1
  172. NotifyPort    RS.l    1
  173. PacketPort    RS.l    1
  174. MyPacket    RS.B    sp_SIZEOF    ;68
  175. VolumeNode    RS.B    DevList_SIZEOF    ;44
  176. FileSize    RS.L    1
  177. TotalSize    RS.L    1
  178. NumLocks    RS.L    1
  179.  
  180. ReqStruct    RS.B    es_SIZEOF    ;20
  181. FormatArgs    RS.L    2
  182.  
  183. *------- DO NOT REARRANGE -----------
  184. StupVolname    RS.L    1
  185. StupIcon    RS.l    1
  186. StupNocopy    RS.l    1
  187. StupNoreq    RS.l    1
  188. StupExpand    RS.l    1
  189. *------- DO NOT REARRANGE -----------
  190.  
  191. DosPort        rs.l    1
  192. MyMsg        rs.b    MN_SIZE+8    ;28
  193. MyFIB        rs.b    fib_SIZEOF    ;260
  194. MyFH        rs.b    fh_SIZEOF    ;44
  195. MyML        rs.b    MLH_SIZE    ;12
  196.  
  197. RootDir        RS.B    myf_Name+MAXNAME    ;28+36=64
  198.  
  199. *------- DO NOT REARRANGE -----------
  200. TempPath    RS.B    MAXPATH        ;256-36
  201. TempName    RS.B    MAXNAME        ;36
  202. *------- DO NOT REARRANGE -----------
  203.  
  204. VolumeName    RS.B    MAXNAME        ;36
  205.  
  206. WriteProtected    RS.B    1
  207. My_SIZEOF    RS.L    0
  208.  
  209. MyPkt        = MyPacket+sp_Pkt
  210.  
  211. *******************************************************
  212.  
  213. *******************************************************
  214.  
  215. * common register usage:
  216. * a4=DOSpacket
  217. * a5=private struct
  218. * a6=execbase
  219.  
  220. start:    movem.l    d2-d7/a2-a6,-(sp)    ;do some basic inits
  221.     move.l    4.w,a6
  222.     suba.l    a1,a1
  223.     sys    FindTask
  224.     movea.l    d0,a2
  225. ;    bset    #0,(pr_Flags+1,a2)    ;unload seglist upon expunge
  226.     lea    (pr_MsgPort,a2),a3
  227.     movea.l    a3,a0
  228.     sys    WaitPort
  229.     movea.l    a3,a0
  230.     sys    GetMsg        ;get startup message
  231.     movea.l    d0,a4
  232.     movea.l    (sp_Msg+MN+LN_NAME,a4),a4
  233.     clr.l    (dp_Res1,a4)
  234.     move.l    #ERROR_NO_FREE_STORE,(dp_Res2,a4)
  235.     move.l    dp_Arg3(a4),d7
  236.     lsl.l    #2,d7
  237.     movea.l    d7,a0
  238.     clr.l    (dn_Task,a0)    ;will restart the handler on failure
  239.     move.l    #My_SIZEOF,d0
  240.     move.l    #MEMF_CLEAR|MEMF_PUBLIC,d1
  241.     sys    AllocVec
  242.     tst.l    d0
  243.     beq    exit1
  244.     movea.l    d0,a5
  245.     DBUG1    txstart,a5
  246.     move.l    a6,(ExecBase,a5)
  247.     move.l    a2,MyProcess(a5)
  248.     move.l    a3,MyMsgPort(a5)
  249.  
  250.     IFD    rom
  251.     moveq    #OLTAG_DOS,d0
  252.     sys    TaggedOpenLibrary
  253.     ELSE
  254.     lea    dosname(pc),a1
  255.     moveq    #37,d0
  256.     sys    OpenLibrary
  257.     ENDC
  258.  
  259.     move.l    d0,DosBase(a5)
  260.     beq    exit2
  261.     lea    (RootDir,a5),a1
  262.     bsr    SetCurrentDate
  263.  
  264.     IFND    rom
  265.     cmp.w    #39,(LIB_VERSION,a6)
  266.     bcs    .OS20
  267.     ENDC
  268.  
  269.     moveq    #1,d0
  270.     move.l    #5000,d1
  271.     move.l    #2000,d2
  272.     sys    CreatePool
  273.     move.l    d0,MyMemPool(a5)
  274. .OS20    lea    (MyML,a5),a0
  275.     NEWLIST    a0
  276.     move.l    d7,MyDeviceNode(a5)
  277.     movea.l    d7,a0
  278.     movea.l    dn_Name(a0),a0
  279.     lea    RootDir+myf_Name(a5),a1
  280.     moveq    #6,d0
  281.     bsr    CopyBSTR2Char
  282.  
  283.     IFND    rom
  284.     lea    intuiname(pc),a1    ;init "unknown packet" requester
  285.     moveq    #36,d0
  286.     sys    OpenLibrary
  287.     move.l    d0,IntuiBase(a5)
  288.     beq.s    .A
  289.     lea    ReqStruct(a5),a0
  290.     moveq    #es_SIZEOF,d0
  291.     move.l    d0,(es_StructSize,a0)
  292.     lea    reqtitle(pc),a1
  293.     move.l    a1,(es_TextFormat,a0)
  294.     lea    reqbutton(pc),a1
  295.     move.l    a1,(es_GadgetFormat,a0)
  296. .A    moveq    #0,d2
  297.  
  298. args:    move.l    DosBase(a5),a6
  299.     move.l    MyDeviceNode(a5),a1
  300.     move.l    dn_Startup(a1),d3
  301.     beq    .A
  302.     clr.l    dn_Startup(a1)
  303.     movea.l    d3,a0
  304.     lea    TempPath(a5),a1
  305.     move.l    a1,a2
  306.     move.l    #MAXPATH-1,d0
  307.     bsr    CopyBSTR2Char
  308.     moveq    #DOS_RDARGS,d1
  309. ;    moveq    #0,d2
  310.     sys    AllocDosObject
  311.     move.l    d0,d3
  312.     beq    .A
  313.     move.l    a2,a0
  314. .D    move.b    (a0)+,d0
  315.     beq.s    .C
  316.     cmp.b    #"_",d0
  317.     bne.s    .D
  318.     move.b    #" ",-1(a0)
  319.     bra.s    .D
  320. .C    move.b    #LF,-1(a0)
  321.     clr.b    (a0)
  322.     sub.l    a2,a0
  323.     lea    (StupVolname,a5),a3
  324.     move.l    a3,d2            ;Argument-Array
  325.     move.l    d3,a1            ;Rd-Args-Struct
  326.     move.l    a2,(a1)+        ;CSource.Buffer
  327.     move.l    a0,(a1)            ;CSource.Length
  328.     lea    template(pc),a0
  329.     move.l    a0,d1            ;Template
  330.     sys    ReadArgs        ;process Startup line
  331.     DBUG4    txargs,(a3),4(a3),8(a3),12(a3)
  332.     move.l    d0,d2
  333.     bne.s    .E
  334.  
  335. * Display requester for bad startup arguments
  336.  
  337.     move.l    IntuiBase(a5),d0
  338.     beq.s    .A
  339.     lea    ReqStruct(a5),a1
  340.     lea    reqreadargs(pc),a0
  341.     move.l    a0,(es_TextFormat,a1)
  342.     sub.l    a2,a2
  343.     sub.l    a3,a3
  344.     sub.l    a0,a0
  345.     movea.l    d0,a6
  346.     sys    EasyRequestArgs
  347.     movea.l    DosBase(a5),a6
  348.     bra.s    .A
  349.  
  350. .E    movea.l    (a3)+,a0
  351.     move.l    a0,d0
  352.     bne.s    .F
  353.     ENDC
  354.  
  355. .A    lea    volname1(pc),a0
  356.  
  357.     IFND    rom
  358.     tst.l    StupIcon(a5)
  359.     beq.s    .F
  360.     lea    volname2(pc),a0
  361.     ENDC
  362.  
  363. .F    lea    VolumeName(a5),a1
  364.     moveq    #MAXNAME-2,d0
  365.     bsr    CopyChar2BSTR
  366.     move.l    d0,d4
  367.  
  368.     IFND    rom
  369.     move.l    d2,d1
  370.     sys    FreeArgs
  371.     moveq    #DOS_RDARGS,d1
  372.     move.l    d3,d2
  373.     beq    .B
  374.     sys    FreeDosObject
  375.     ENDC
  376.  
  377. .B    move.l    d4,(StupVolname,a5)
  378.     movea.l    (ExecBase,a5),a6
  379.  
  380. upconv:    bsr    InitConversion        ;init upper case table
  381.     sys    CreateMsgPort
  382.     move.l    d0,(NotifyPort,a5)
  383.     beq    exit3
  384.  
  385.     IFND    rom
  386.     tst.l    StupNocopy(a5)
  387.     bne    nocopy
  388.     ENDC
  389.  
  390.     sys    CreateMsgPort
  391.     move.l    d0,(PacketPort,a5)
  392.     beq    exit4
  393.     move.l    d0,d6
  394.     clr.l    -(sp)
  395.     pea    (procn,pc)
  396.     move.l    #NP_Name,-(sp)
  397.     pea    (procc,pc)
  398.     move.l    #NP_Entry,-(sp)
  399.     movea.l    (DosBase,a5),a6
  400.     move.l    sp,d1
  401.     sys    CreateNewProc
  402.     movea.l    (ExecBase,a5),a6
  403.     lea    (20,sp),sp
  404.     tst.l    d0
  405.     beq    exit5
  406.     movea.l    d0,a2
  407.     
  408.     movea.l    a2,a1
  409.     move.l    a5,(TC_Userdata,a2)    ;stuff our data area to userdata
  410.     move.l    #SIGBREAKF_CTRL_F,d0    ;let's use CTRL-F for signalling
  411.     sys    Signal            ;we're done
  412.  
  413.     movea.l    d6,a0
  414.     moveq    #1,d0
  415.     move.b    (MP_SIGBIT,a0),d1
  416.     lsl.l    d1,d0
  417.     sys    Wait
  418.  
  419.     lea    (MyMsg,a5),a0        ;init message
  420.     moveq    #MN_SIZE+8,d0
  421.     move.w    d0,(MN_LENGTH,a0)
  422.     moveq    #NT_MESSAGE,d0
  423.     move.b    d0,(LN_TYPE,a0)
  424.     move.l    d6,(MN_REPLYPORT,a0)
  425.  
  426. nocopy:    lea    RootDir(a5),a2        ;create Lock for DiskInfo
  427.     moveq    #ACCESS_READ,d2
  428.     bsr    CreateLock
  429.     move.l    d0,RootLock(a5)
  430.     beq    exit6
  431.  
  432. volnod:    lea    VolumeNode(a5),a2    ;set up volume node
  433.     move.l    a2,d0
  434.     lsr.l    #2,d0
  435.     move.l    d0,MyVolumeBPTR(a5)
  436.     moveq    #DLT_VOLUME,d0
  437.     move.l    d0,dl_Type(a2)
  438.     move.l    MyMsgPort(a5),dl_Task(a2)
  439.     move.l    #"DOS"<<8,dl_DiskType(a2)
  440.     move.l    (StupVolname,a5),(dl_Name,a2)
  441.     lea    (dl_VolumeDate,a2),a0
  442.     move.l    a0,d1
  443.     movea.l    (DosBase,a5),a6
  444.     sys    DateStamp
  445.  
  446.     IFND    rom
  447.     tst.l    StupIcon(a5)
  448.     beq.s    .D
  449.     moveq    #LDF_VOLUMES|LDF_WRITE,d1
  450.     sys    AttemptLockDosList
  451.     andi.l    #~1,d0
  452.     beq    exit7
  453.     move.l    a2,d1
  454.     sys    AddDosEntry
  455.     move.l    d0,d2
  456.     moveq    #LDF_VOLUMES|LDF_WRITE,d1
  457.     sys    UnLockDosList
  458.     tst.l    d2
  459.     beq    exit7
  460.     ENDC
  461.  
  462. .D    movea.l    d7,a0        ;DeviceNode
  463.     move.l    (MyMsgPort,a5),(dn_Task,a0)
  464.     moveq    #DOSTRUE,d2        ;init ok: reply startup packet
  465.     moveq    #0,d3
  466.     move.l    a4,d1
  467.     sys    ReplyPkt
  468.  
  469. loop:    sys    WaitPkt
  470.     movea.l    d0,a4
  471.     clr.l    (dp_Res1,a4)
  472.     clr.l    (dp_Res2,a4)
  473.  
  474. * Handle replies of Notify messages
  475. GetNotify:
  476. \A    movea.l    NotifyPort(a5),a0
  477.     movea.l    (ExecBase,a5),a6
  478.     sys    GetMsg
  479.     tst.l    d0
  480.     beq.s    \E
  481.     move.l    d0,a1
  482.     DBUG1    txgnoti,a1
  483. ;    move.l    nm_NReq(a1),a0
  484. ;    subq.l    #1,nr_MsgCount(a0)
  485.     moveq    #NotifyMessage_SIZEOF,d0
  486.     bsr    FreeMem
  487.     bra.s    \A
  488.  
  489. \E    move.l    dp_Type(a4),d0
  490.  
  491.     IFD    DEBUG
  492.     move.l    dp_Port(a4),a1
  493.     move.l    MP_SIGTASK(a1),a1
  494.     move.l    LN_NAME(a1),a1
  495.     DBUG5    txpack,d0,dp_Arg1(a4),dp_Arg2(a4),dp_Arg3(a4),a1
  496.     ENDC
  497.  
  498.     move.l    d0,d1
  499.     swap    d1
  500.     tst.w    d1
  501.     bne.s    .A
  502.     lea    start(pc),a1
  503.     lea    JumpTable(pc),a2
  504.     moveq    #0,d2
  505. .C    move.w    (a2)+,d1
  506.     bpl.s    .E
  507. .A    DBUG1    txerr1,d0
  508.     IFND    rom
  509.     bsr    RequestUnknown
  510.     ENDC
  511.     move.w    #ERROR_ACTION_NOT_KNOWN,(dp_Res2+2,a4)
  512.     bra.s    .D
  513.  
  514. .E    move.w    (a2)+,d2
  515.     cmp.w    d0,d1
  516.     bne.s    .C
  517.     add.l    d2,a1
  518.                 ;***
  519.  
  520. * packets must preserve a5/a4; all others may be trashed
  521.  
  522.     jsr    (a1)        ;jump into subroutine to process packet
  523.                 ;***
  524. .D
  525.     IFD    DEBUG
  526.     moveq    #DOSTRUE,d0
  527.     cmp.l    dp_Res1(a4),d0
  528.     beq.s    .\@H
  529.     DBUG2    txres,dp_Res1(a4),dp_Res2(a4)
  530. .\@H    ENDC
  531.  
  532. _rp    movea.l    (DosBase,a5),a6
  533. _rp1    move.l    (dp_Res1,a4),d2
  534.     move.l    (dp_Res2,a4),d3
  535.     move.l    a4,d1
  536.     sys    ReplyPkt
  537.     bra    loop
  538.  
  539. ADie:    addq.l    #4,sp            ;exit routine
  540.  
  541.     move.w    #ERROR_OBJECT_IN_USE,(dp_Res2+2,a4)
  542.     move.l    NumLocks(a5),d0
  543.     subq.l    #1,d0
  544.     bne    _rp
  545.     tst.l    (NotifyList,a5)
  546.     bne    _rp
  547.  
  548.     IFND    rom
  549.     tst.l    StupIcon(a5)
  550.     beq    .A
  551.     movea.l    (DosBase,a5),a6
  552.     moveq    #LDF_DEVICES|LDF_VOLUMES|LDF_WRITE,d1
  553.     sys    AttemptLockDosList
  554.     andi.l    #~1,d0
  555.     beq    _rp1
  556.     lea    (VolumeNode,a5),a0
  557.     move.l    a0,d1
  558.     sys    RemDosEntry
  559.     move.l    d0,d2
  560.     beq    .B
  561.     move.l    (MyDeviceNode,a5),d1
  562.     sys    RemDosEntry
  563. .B    moveq    #LDF_DEVICES|LDF_VOLUMES|LDF_WRITE,d1
  564.     sys    UnLockDosList
  565.     tst.l    d2
  566.     beq    _rp1
  567.     movea.l    (ExecBase,a5),a6
  568.     ENDC
  569. .A
  570.  
  571. * Reply all packets that are waiting to be processed (for exit)
  572. FlushPackets:
  573. .A    move.l    MyMsgPort(a5),a0
  574.     sys    GetMsg
  575.     tst.l    d0
  576.     beq    .exit
  577.     move.l    d0,a1
  578.     move.l    (MN+LN_NAME,a1),d0
  579.     beq.s    .A
  580.     movea.l    d0,a0
  581.     clr.l    (dp_Res1,a0)
  582.     move.l    #ERROR_ACTION_NOT_KNOWN,(dp_Res2,a0)
  583.     clr.l    (dp_Port,a0)
  584.     sys    ReplyMsg
  585.     bra.s    .A
  586.  
  587. .exit    moveq    #DOSTRUE,d0
  588.     move.l    d0,(dp_Res1,a4)
  589.     move.l    MyDeviceNode(a5),a0
  590.     clr.l    dn_Task(a0)
  591.     clr.l    (MyMsgPort,a5)
  592. exit7:    movea.l    (ExecBase,a5),a6
  593.     move.l    RootLock(a5),a1
  594.     bsr    FreeLock
  595. exit6:
  596.     IFND    rom
  597.     tst.l    StupNocopy(a5)
  598.     bne    exit4
  599.     ENDC
  600.  
  601.     lea    (MyMsg,a5),a1
  602.     clr.l    (MN_SIZE,a1)        ;=QUIT
  603.     movea.l    (DosPort,a5),a0
  604.     sys    PutMsg
  605.     movea.l    (PacketPort,a5),a0
  606.     sys    WaitPort
  607. exit5:    movea.l    (PacketPort,a5),a0
  608.     sys    DeleteMsgPort
  609. exit4:    movea.l    (NotifyPort,a5),a0
  610.     sys    DeleteMsgPort
  611. exit3:    move.l    DosBase(a5),a1
  612.     sys    CloseLibrary
  613.     DBUG3    txend,FileSize(a5),TotalSize(a5),NumLocks(a5)
  614.     move.l    MyMemPool(a5),d0
  615.     beq.s    .A
  616.     move.l    d0,a0
  617.     sys    DeletePool
  618. .A    lea    (MyML,a5),a2
  619. .C    IFEMPTY    a2,exit2
  620.     SUCC    a2,a1
  621.     bsr    _free
  622.     bra    .C
  623.  
  624. exit2:    movea.l    (MyMsgPort,a5),a3
  625.     move.l    a5,a1
  626.     sys    FreeVec
  627. exit1:    movea.l    (dp_Link,a4),a1
  628.     movea.l    (dp_Port,a4),a0
  629.     move.l    a3,(dp_Port,a4)
  630.     clr.l    (MN,a1)
  631.     clr.l    (MN+LN_PRED,a1)
  632.     sys    PutMsg        ;reply startup/die message
  633.     movem.l    (sp)+,d2-d7/a2-a6
  634.     moveq    #0,d0
  635.     rts
  636.  
  637. *******************************************************
  638.  
  639. * table for branching from main to subroutine depending on the
  640. * current packet
  641.  
  642. JumpTable:
  643.     dc.w    ACTION_NIL,NoAction-start
  644.     dc.w    ACTION_SET_PROTECT,ASetProtect-start
  645.     dc.w    ACTION_SET_COMMENT,Unsupported-start
  646.     dc.w    ACTION_SET_DATE,ASetDate-start
  647.     dc.w    ACTION_INHIBIT,Unsupported-start
  648.     dc.w    ACTION_FLUSH,NoAction-start
  649.     dc.w    ACTION_IS_FILESYSTEM,NoAction-start
  650.  
  651.     dc.w    ACTION_DIE,ADie-start
  652.     dc.w    ACTION_CURRENT_VOLUME,ACurrentVolume-start
  653.     dc.w    ACTION_RENAME_DISK,ARenameDisk-start
  654.     dc.w    ACTION_WRITE_PROTECT,AWriteProtect-start
  655.  
  656.     dc.w    ACTION_FINDUPDATE,AOpenReadWrite-start
  657.     dc.w    ACTION_FINDINPUT,AOpenOldfile-start
  658.     dc.w    ACTION_FINDOUTPUT,AOpenNewfile-start
  659.     dc.w    ACTION_END,ACloseFile-start
  660.     dc.w    ACTION_SEEK,ASeekPosition-start
  661.     dc.w    ACTION_READ,AReadFile-start
  662.     dc.w    ACTION_WRITE,AWriteFile-start
  663.     dc.w    ACTION_DELETE_OBJECT,ADeleteObject-start
  664.     dc.w    ACTION_RENAME_OBJECT,ARenameObject-start
  665.     dc.w    ACTION_CREATE_DIR,ACreateDir-start
  666.  
  667.     dc.w    ACTION_LOCATE_OBJECT,ALocateObject-start
  668.     dc.w    ACTION_PARENT,AParentDir-start
  669.     dc.w    ACTION_COPY_DIR,ADuplicateLock-start
  670.     dc.w    ACTION_FREE_LOCK,AFreeLock-start
  671.     dc.w    ACTION_SAME_LOCK,ASameLock-start
  672.     dc.w    ACTION_EXAMINE_OBJECT,AExamineObject-start
  673.     dc.w    ACTION_EXAMINE_ALL,Unsupported-start
  674.     dc.w    ACTION_EXAMINE_FH,AExamineFH-start
  675.     dc.w    ACTION_EXAMINE_ALL_END,Unsupported-start
  676.     dc.w    ACTION_EXAMINE_NEXT,AExamineNext-start
  677.     dc.w    ACTION_DISK_INFO,ADiskInfo1-start
  678.     dc.w    ACTION_INFO,ADiskInfo2-start
  679.  
  680.     dc.w    ACTION_ADD_NOTIFY,AAddNotify-start
  681.     dc.w    ACTION_REMOVE_NOTIFY,ARemoveNotify-start
  682.     dc.w    ACTION_SET_FILE_SIZE,ASetFileSize-start
  683.     dc.w    ACTION_FH_FROM_LOCK,AFHfromLock-start
  684.     dc.w    ACTION_CHANGE_MODE,AChangeMode-start
  685.     dc.w    ACTION_COPY_DIR_FH,ADupLockFromFH-start
  686.     dc.w    ACTION_PARENT_FH,AParentFromFH-start
  687.     dc.w    -1
  688.  
  689.  
  690. * strings
  691.  
  692. volname1    dc.b    "Env",0
  693. reqtitle    dc.b    "HappyENV warning:",0
  694. procn        dc.b    'HappyENV DOS-process',0
  695. requnknown    dc.b    "Task %s",LF,"uses packet %ld",0
  696. reqbutton    dc.b    "OK",0
  697.  
  698.     IFND    rom
  699. intuiname    dc.b    "intuition.library",0
  700. dosname        dc.b    "dos.library",0
  701. utilname    dc.b    "utility.library",0
  702. _expn        dc.b    'expansion.library',0
  703. reqreadargs    dc.b    "Bad startup arguments",0
  704. template    dc.b    "VOLNAME/K,ICON/S,NOCOPY/S,NOREQ/S",0
  705. volname2    dc.b    "Environment",0
  706.     ENDC
  707.  
  708. envarc        dc.b    'ENVARC:',0
  709.  
  710.         IFD    EXPAND
  711. prefstx        dc.b    "prefs",0
  712. configtx    dc.b    "config",0
  713.         ENDC
  714.  
  715.         even
  716.  
  717. *******************************************************
  718.  
  719. * Init to-upper-conversion table which allows
  720. * quick case independent compares
  721. InitConversion:
  722.     lea    CharTable(a5),a2
  723.     move.w    #255,d2
  724.     move.w    d2,d0
  725. .A    move.b    d0,0(a2,d0.w)
  726.     dbra    d0,.A
  727.     moveq    #"A",d0
  728. .C    move.b    d0,"a"-"A"(a2,d0.w)
  729.     addq.w    #1,d0
  730.     cmp.b    #"Z"+1,d0
  731.     bne.s    .C
  732.     move.w    #192,d0
  733. .F    move.b    d0,224-192(a2,d0.w)
  734.     addq.w    #1,d0
  735.     cmp.b    #222+1,d0
  736.     bne.s    .F
  737.  
  738.     IFD    rom
  739.     moveq    #OLTAG_UTILITY,d0
  740.     sys    TaggedOpenLibrary
  741.     ELSE
  742.     lea    utilname(pc),a1        ;open utility.library
  743.     moveq    #37,d0
  744.     sys    OpenLibrary
  745.     ENDC
  746.  
  747.     tst.l    d0
  748.     beq.s    .D
  749.     move.l    d0,a6
  750. .E    move.w    d2,d0
  751.     sys    ToUpper
  752.     move.b    d0,0(a2,d2.w)
  753.     dbra    d2,.E
  754.     move.l    a6,a1
  755.     move.l    (ExecBase,a5),a6
  756.     sys    CloseLibrary
  757. .D    rts
  758.  
  759. * Display requester for unknown packets
  760.  
  761.     IFND    rom
  762. RequestUnknown:
  763.     tst.l    StupNoreq(a5)
  764.     bne.s    .A
  765.     move.l    IntuiBase(a5),d0
  766.     beq.s    .A
  767.     movea.l    d0,a6
  768.     lea    ReqStruct(a5),a1
  769.     lea    requnknown(pc),a0
  770.     move.l    a0,(es_TextFormat,a1)
  771.     sub.l    a2,a2
  772.     lea    FormatArgs(a5),a3
  773.     move.l    dp_Type(a4),4(a3)
  774.     move.l    dp_Port(a4),a0
  775.     move.l    MP_SIGTASK(a0),a0
  776.     move.l    LN_NAME(a0),(a3)
  777.     sub.l    a0,a0
  778.     sys    EasyRequestArgs
  779.     move.l    (ExecBase,a5),a6
  780. .A    rts
  781.     ENDC
  782.  
  783. *******************************************************
  784.  
  785. *******************************************************
  786.  
  787.  
  788. * Following there are all subroutines to process the individual packets
  789. * It starts with some general purpose and Filehandle handling ones.
  790.  
  791. * No action will be performed
  792. NoAction:
  793.     moveq    #DOSTRUE,d0
  794.     move.l    d0,dp_Res1(a4)
  795.     rts
  796.  
  797. ACurrentVolume:
  798.     move.l    MyVolumeBPTR(a5),dp_Res1(a4)
  799.     bra    NoAction
  800.  
  801. * For unsupported packets without showing a requester
  802. Unsupported:
  803.     DBUG1    txerr1,dp_Type(a4)
  804.     move.w    #ERROR_ACTION_NOT_KNOWN,(dp_Res2+2,a4)
  805. _ret1    rts
  806.  
  807.  
  808. ARenameDisk:
  809.     move.w    #ERROR_DISK_WRITE_PROTECTED,(dp_Res2+2,a4)
  810.     tst.b    WriteProtected(a5)
  811.     bne    _ret1
  812.     move.l    dp_Arg1(a4),a0
  813.     lea    TempName(a5),a1
  814.     moveq    #MAXNAME-2,d0
  815.     bsr    CopyBSTR2Char
  816.     lea    TempName(a5),a0
  817.     lea    VolumeName(a5),a1
  818.     moveq    #MAXNAME-2,d0
  819.     bsr    CopyChar2BSTR
  820.     bra    NoAction
  821.  
  822. AWriteProtect:
  823.     move.l    dp_Arg1(a4),d0
  824.     move.b    d0,WriteProtected(a5)
  825.     bra    NoAction
  826.  
  827. AOpenOldfile:
  828.     move.l    dp_Arg3(a4),a0
  829.     move.l    dp_Arg2(a4),d0
  830.     moveq    #ACCESS_READ,d2
  831.     bsr    LocateObject
  832. OpnOld:    move.l    dp_Arg1(a4),a3    ;label used by AOpenReadWrite and AFHFromLock
  833.     add.l    a3,a3
  834.     add.l    a3,a3
  835.     clr.l    fh_Interactive(a3)
  836.     move.l    d0,fh_Arg1(a3)
  837.     beq    _ret2
  838.     move.l    d0,a0
  839.     move.l    myl_Key(a0),a1
  840.     move.w    #ERROR_OBJECT_WRONG_TYPE,(dp_Res2+2,a4)
  841.     tst.b    myf_Type(a1)        ;do not open dirs
  842.     bmi.s    .A
  843.     move.l    a0,a1
  844.     bsr    FreeLock
  845.     bra    _ret2
  846. .A    move.l    myf_Size(a1),myl_Size(a0)
  847.     moveq    #0,d0
  848.     move.b    myf_DataOffs(a1),d0
  849.     add.l    d0,a1
  850.     move.l    a1,myl_Data(a0)
  851.     move.b    #1,myl_Mode(a0)
  852.     DBUG1    txopeno,fh_Arg1(a3)
  853.     bra    NoAction
  854.  
  855. AOpenReadWrite:
  856.     move.l    dp_Arg3(a4),a0
  857.     move.l    dp_Arg2(a4),d0
  858.     moveq    #ACCESS_READ,d2
  859.     bsr    LocateObject
  860.     bne.s    OpnOld
  861.  
  862. AOpenNewfile:
  863.     move.w    #ERROR_DISK_WRITE_PROTECTED,(dp_Res2+2,a4)
  864.     tst.b    WriteProtected(a5)
  865.     bne    _ret2
  866.     move.w    #ERROR_OBJECT_EXISTS,(dp_Res2+2,a4)
  867.     move.l    dp_Arg1(a4),a3
  868.     add.l    a3,a3
  869.     add.l    a3,a3
  870.     clr.l    fh_Interactive(a3)
  871.     move.l    dp_Arg2(a4),d0        ;does file already exist ?
  872.     move.l    dp_Arg3(a4),a0
  873.     bsr    SearchObject
  874.     beq.s    .A
  875.     move.l    d0,a1
  876.     tst.b    myf_Type(a1)        ;do not overwrite dirs
  877.     bpl    _ret2
  878.     move.w    #ERROR_DELETE_PROTECTED,(dp_Res2+2,a4)
  879.     btst    #FIBB_DELETE,(myf_Attrs,a1)
  880.     bne    _ret2
  881.     move.w    #ERROR_WRITE_PROTECTED,(dp_Res2+2,a4)
  882.     btst    #FIBB_WRITE,(myf_Attrs,a1)
  883.     bne    _ret2
  884.     move.l    (myf_Parent,a1),-(sp)
  885.     bsr    DeleteObject
  886.     movea.l    (sp)+,a1
  887.     beq    _ret2
  888.     bsr    SetCurrentDate        ;update parent date
  889. .A    bsr    SplitPath
  890.     move.w    #ERROR_DIR_NOT_FOUND,(dp_Res2+2,a4)
  891.     move.l    dp_Arg2(a4),d0
  892.     bsr    CreatePath
  893.     beq    _ret2
  894.     move.l    a3,-(sp)
  895.     move.l    d0,a3
  896.     lea    TempName(a5),a2
  897.     moveq    #0,d2
  898.     bsr    CreateNewObject
  899.     move.l    (sp)+,a3
  900.     beq.s    _ret2
  901.     move.l    d0,a2
  902.     moveq    #ACCESS_WRITE,d2
  903.     bsr    CreateLock
  904.     move.l    d0,fh_Arg1(a3)
  905.     beq.s    _ret2
  906.     move.l    d0,a0
  907.     moveq    #DOSTRUE,d0
  908.     move.b    d0,myl_Mode(a0)
  909.     move.l    d0,dp_Res1(a4)
  910.     bset    #3,(myf_Type,a2)
  911.     DBUG1    txopenn,fh_Arg1(a3)
  912.     movea.l    (myf_Parent,a2),a1
  913.     bsr    SetCurrentDate        ;update parent date
  914. _ret2    rts
  915.  
  916. ACloseFile:
  917.     move.l    dp_Arg1(a4),a1
  918.     tst.b    myl_Mode(a1)
  919.     bmi.s    .D
  920.     bsr    FreeLock
  921.     bra.s    .ok
  922. .D    move.l    myl_Size(a1),d2
  923.     move.l    myl_Key(a1),a2
  924.     move.l    myf_Parent(a2),a3
  925.     lea    myf_Name(a2),a2
  926.     bsr    CreateNewObject
  927.     beq.s    _ret2
  928.     move.l    d0,d4
  929.     move.l    d0,a3
  930.     add.l    d1,a3
  931.     move.l    dp_Arg1(a4),a2
  932.     bsr    CopyBlocksToMem
  933.     move.l    a2,a1
  934.     move.l    myl_Key(a2),a2
  935.     bsr    FreeLock
  936.     moveq    #3,d0
  937.     btst    d0,(myf_Type,a2)    ;file has been modified?
  938.     beq    .unset
  939.     movea.l    d4,a1
  940.     bset    d0,(myf_Type,a1)
  941.     bclr    #FIBB_ARCHIVE,(myf_Type,a1)
  942.     bsr    SetCurrentDate        ;update object date
  943.     movea.l    d4,a1
  944.     movea.l    (myl_Key,a1),a0
  945.     bclr    #FIBB_ARCHIVE,(myf_Type,a0)
  946.     movea.l    (myf_Parent,a1),a1
  947.     bsr    SetCurrentDate        ;update parent date
  948. .unset    move.l    a2,a1
  949.     bsr    DeleteObj
  950.     beq.s    _ret2
  951.     move.l    d4,a0
  952.     bsr    CheckNotify
  953. .ok    bra    NoAction
  954.  
  955. * Copy all blocks of a filehandle to memory
  956. * ENTRY: a2=lock, a3=destination memory
  957. * EXIT: nothing (some registers changed)
  958. * USED BY: ACloseFile, ASetFileSize
  959. CopyBlocksToMem:
  960.     move.l    myl_Start(a2),d3
  961. .F    tst.l    d3
  962.     beq    _ret2
  963.     move.l    d3,-(sp)
  964.     move.l    d3,a0
  965.     move.l    (a0)+,d3
  966.     move.l    (a0)+,d2
  967.     move.l    a3,a1
  968.     move.l    d2,d0
  969.     sys    CopyMem
  970.     add.l    d2,a3
  971.     move.l    d2,d0
  972.     addq.l    #8,d0
  973.     move.l    (sp)+,a1
  974.     bsr    FreeMem
  975.     bra.s    .F
  976.  
  977. AWriteFile:
  978.     moveq    #-1,d0
  979.     move.l    d0,dp_Res1(a4)
  980.     move.w    #ERROR_DISK_WRITE_PROTECTED,(dp_Res2+2,a4)
  981.     tst.b    WriteProtected(a5)
  982.     bne    .fail
  983.     move.l    dp_Arg1(a4),a2        ;lock
  984.     movea.l    (myl_Key,a2),a0
  985.     move.w    #ERROR_WRITE_PROTECTED,(dp_Res2+2,a4)
  986.     btst    #FIBB_WRITE,(myf_Attrs,a0)
  987.     bne    .fail
  988.     move.l    dp_Arg2(a4),a3        ;buffer
  989.     move.l    dp_Arg3(a4),d3        ;length
  990.     bsr    ReadToWriteMode
  991.     beq    .fail
  992. .F    move.l    d3,d2
  993.     move.l    myl_Block(a2),d0
  994.     beq.s    .E
  995.     move.l    d0,a1
  996.     move.l    4(a1),d0
  997.     sub.l    myl_BlockPos(a2),d0
  998.     beq.s    .C
  999.     bmi.s    .C
  1000.     MIN    d0,d2,G
  1001. .D    addq.l    #8,a1
  1002.     add.l    myl_BlockPos(a2),a1
  1003.     move.l    a3,a0
  1004.     move.l    d2,d0
  1005.     sys    CopyMem
  1006.     DBUG2    txwins,d2,myl_Pos(a2)
  1007.     add.l    d2,a3
  1008.     add.l    d2,myl_Pos(a2)
  1009.     add.l    d2,myl_BlockPos(a2)
  1010.     sub.l    d2,d3
  1011.     beq.s    .ok
  1012.     bra.s    .F
  1013.  
  1014. .C    move.l    (a1),d0
  1015.     beq.s    .E
  1016.     move.l    d0,myl_Block(a2)
  1017.     clr.l    myl_BlockPos(a2)
  1018.     bra.s    .F    
  1019.     
  1020. .E    bsr    AppendNewBlock
  1021.     beq.s    .fail
  1022.     clr.w    (dp_Res2+2,a4)
  1023.     move.l    a3,a0
  1024.     move.l    d3,d0
  1025.     sys    CopyMem
  1026.     add.l    d3,myl_Pos(a2)
  1027.     move.l    d3,myl_BlockPos(a2)
  1028. .ok    move.l    dp_Arg3(a4),dp_Res1(a4)    ;zero length writes are skipped
  1029.     beq    .fail
  1030.     movea.l    (myl_Key,a2),a1
  1031.     bset    #3,(myf_Type,a1)    ;notification attention
  1032.     DBUG3    txwrite,dp_Arg3(a4),myl_Pos(a2),myl_Size(a2)
  1033. .fail    rts
  1034.  
  1035. ASetFileSize:
  1036.     moveq    #DOSTRUE,d0
  1037.     move.l    d0,dp_Res1(a4)
  1038.     move.w    #ERROR_DISK_WRITE_PROTECTED,(dp_Res2+2,a4)
  1039.     tst.b    WriteProtected(a5)
  1040.     bne    .fail
  1041.     move.l    dp_Arg1(a4),a2        ;a2=lock
  1042.     movea.l    (myl_Key,a2),a0
  1043.     move.w    #ERROR_WRITE_PROTECTED,(dp_Res2+2,a4)
  1044.     btst    #FIBB_WRITE,(myf_Attrs,a0)
  1045.     bne    .fail
  1046.     move.w    #ERROR_SEEK_ERROR,(dp_Res2+2,a4)
  1047.     move.l    dp_Arg2(a4),d3        ;d3=position to truncate
  1048.     move.l    dp_Arg3(a4),d2        ;d2=mode
  1049.     move.l    myl_Size(a2),d4        ;d4=old size
  1050. ;    moveq    #OFFSET_BEGINNING,d0
  1051.     cmp.l    d0,d2
  1052.     beq.s    .E
  1053.     moveq    #OFFSET_END,d0
  1054.     cmp.l    d0,d2
  1055.     bne.s    .C
  1056.     add.l    d4,d3
  1057.     bra.s    .E
  1058.  
  1059. .C    tst.l    d2
  1060.     bne    .fail
  1061.     add.l    myl_Pos(a2),d3
  1062. .E    DBUG2    txsize,myl_Key(a2),d4,d3
  1063.     tst.l    d3            ;d3=new size
  1064.     bmi    .fail
  1065.     cmp.l    d4,d3
  1066.     beq.s    .ok            ;size will not change
  1067.     bhi.s    .A            ;append some data
  1068.  
  1069.     move.l    d3,myl_Size(a2)        ;truncate some data
  1070.     MIN    d3,myl_Pos(a2),F
  1071.     bsr    ReadToWriteMode
  1072.     beq.s    .fail
  1073.     cmp.b    #1,d0
  1074.     beq.s    .ok
  1075.     move.l    myl_Pos(a2),myl_BlockPos(a2)
  1076.     move.l    d3,d0
  1077.     beq.s    .D
  1078.     bsr    CreateNewBlock
  1079.     beq.s    .fail
  1080. .D    move.l    myl_Start(a2),d4
  1081.     move.l    d0,myl_Block(a2)
  1082.     move.l    d0,myl_Start(a2)
  1083.     move.l    a1,a3
  1084. .J    tst.l    d4
  1085.     beq.s    .ok
  1086.     move.l    d4,-(sp)
  1087.     move.l    d4,a0
  1088.     move.l    (a0)+,d4
  1089.     move.l    (a0)+,d2
  1090.     cmp.l    d2,d3
  1091.     bls.s    .G
  1092.     move.l    d2,d0
  1093.     sub.l    d2,d3
  1094.     bra.s    .H
  1095. .G    move.l    d3,d0
  1096.     beq.s    .I
  1097.     moveq    #0,d3
  1098. .H    move.l    a3,a1
  1099.     sys    CopyMem
  1100. .I    add.l    d2,a3
  1101.     move.l    d2,d0
  1102.     addq.l    #8,d0
  1103.     move.l    (sp)+,a1
  1104.     bsr    FreeMem
  1105.     bra.s    .J
  1106.  
  1107. .A    bsr    ReadToWriteMode        ;append some data
  1108.     beq.s    .fail
  1109.     sub.l    d4,d3
  1110.     bsr    AppendNewBlock
  1111.     beq.s    .fail
  1112. .ok    move.l    myl_Size(a2),dp_Res1(a4)
  1113.     beq    .fail
  1114.     movea.l    (myl_Key,a2),a0
  1115.     bset    #3,(myf_Type,a0)    ;notification attention
  1116. .fail    rts
  1117.  
  1118.  
  1119. * Convert Lock from Read to Write mode
  1120. * ENTRY: a2=lock
  1121. * EXIT:  d0,Z=success (0=fail, 1=changed, 2=not changed)
  1122. * USED BY: AWriteFile, ASetFileSize
  1123. ReadToWriteMode:
  1124.     moveq    #2,d0
  1125.     tst.b    myl_Mode(a2)
  1126.     bmi.s    .ok
  1127.     move.w    #ERROR_WRITE_PROTECTED,(dp_Res2+2,a4)
  1128.     move.l    myl_Key(a2),a0
  1129.     move.b    myf_Locks(a0),d0
  1130.     cmpi.b    #-1,d0
  1131.     beq    .wr
  1132.     cmpi.b    #1,d0
  1133.     bhi.s    .fail
  1134. .wr    move.l    myl_Size(a2),d0
  1135.     beq.s    .A
  1136.     bsr    CreateNewBlock
  1137.     beq.s    .fail
  1138. .A    move.l    d0,myl_Block(a2)
  1139.     move.l    d0,myl_Start(a2)
  1140.     move.l    myl_Pos(a2),myl_BlockPos(a2)
  1141.     st    myl_Mode(a2)
  1142.     move.l    myl_Key(a2),a0
  1143.     st    myf_Locks(a0)
  1144.     move.l    myl_Data(a2),a0
  1145.     move.l    myl_Size(a2),d0
  1146.     beq.s    .C
  1147.     sys    CopyMem
  1148. .C    DBUG2    txchng,myl_Key(a2),myl_Pos(a2),myl_Size(a2)
  1149.     moveq    #1,d0
  1150. .ok    rts
  1151. .fail    moveq    #0,d0
  1152.     rts
  1153.  
  1154. * Create and append a new block as last one to block list
  1155. * ENTRY: d3=size, a2=lock
  1156. * EXIT:  d0,Z=success, a1=newblock+8
  1157. * USED BY: AWriteFile, ASetFileSize
  1158. AppendNewBlock:
  1159.     move.l    d3,d0
  1160.     bsr    CreateNewBlock
  1161.     beq.s    .fail
  1162.     add.l    d3,myl_Size(a2)
  1163.     move.l    myl_Block(a2),a0
  1164.     move.l    d0,myl_Block(a2)
  1165.     move.l    a0,d1
  1166.     bne.s    .A
  1167.     lea    myl_Start(a2),a0
  1168. .A    move.l    (a0),d1            ;look for end of blocks
  1169.     beq.s    .C            ; for SetFileSize
  1170.     move.l    d1,a0
  1171.     bra.s    .A
  1172. .C    move.l    d0,(a0)            ;insert new block as last
  1173.     moveq    #1,d0
  1174. .fail    rts
  1175.  
  1176. * Allocates memory for a new block
  1177. * ENTRY: d0=size
  1178. * EXIT:  d0=block , a1=block+8
  1179. * USED BY: AppendNewBlock, ReadToWriteMode, ASetFileSIze
  1180. CreateNewBlock:
  1181.     move.w    #ERROR_DISK_FULL,(dp_Res2+2,a4)
  1182.     move.l    d0,-(sp)
  1183.     addq.l    #8,d0
  1184.     bsr    AllocMem
  1185.     beq.s    .fail
  1186.     move.l    d0,a1
  1187.     clr.l    (a1)+
  1188.     move.l    (sp),(a1)+
  1189. .fail    addq.l    #4,sp
  1190.     tst.l    d0
  1191.     rts
  1192.  
  1193. AReadFile:
  1194.     move.l    dp_Arg1(a4),a2        ;lock
  1195.     movea.l    (myl_Key,a2),a0
  1196.     move.w    #ERROR_READ_PROTECTED,(dp_Res2+2,a4)
  1197.     btst    #FIBB_READ,(myf_Attrs,a0)
  1198.     bne    .ok
  1199.     move.l    dp_Arg2(a4),a3        ;buffer
  1200.     move.l    myl_Size(a2),d0
  1201.     move.l    myl_Pos(a2),a0
  1202.     sub.l    a0,d0
  1203.     move.l    dp_Arg3(a4),d3        ;length
  1204.     MIN    d0,d3,G
  1205. ;    clr.w    (dp_Res2+2,a4)
  1206.     DBUG3    txread,d3,dp_Arg3(a4),myl_Pos(a2)
  1207.     add.l    d3,myl_Pos(a2)
  1208.     move.l    d3,dp_Res1(a4)
  1209.     beq.s    .ok
  1210.     tst.b    myl_Mode(a2)
  1211.     bpl.s    .E
  1212.  
  1213. .F    move.l    d3,d2
  1214.     move.l    myl_Block(a2),a0
  1215.     move.l    4(a0),d0
  1216.     sub.l    myl_BlockPos(a2),d0
  1217.     beq.s    .C
  1218.     bmi.s    .C
  1219.     MIN    d0,d2,D
  1220.     addq.l    #8,a0
  1221.     add.l    myl_BlockPos(a2),a0
  1222.     move.l    a3,a1
  1223.     move.l    d2,d0
  1224.     sys    CopyMem
  1225.     add.l    d2,a3
  1226.     add.l    d2,myl_BlockPos(a2)
  1227.     sub.l    d2,d3
  1228.     beq.s    .ok
  1229.     bra.s    .F
  1230. .C    move.l    (a1),d0
  1231.     beq.s    .ok
  1232.     move.l    d0,myl_Block(a2)
  1233.     clr.l    myl_BlockPos(a2)
  1234.     bra    .F
  1235.  
  1236. .E    move.l    myl_Data(a2),d0
  1237.     add.l    d0,a0
  1238.     move.l    a3,a1
  1239.     move.l    d3,d0
  1240.     sys    CopyMem
  1241. .ok    rts
  1242.  
  1243. ASeekPosition
  1244.     move.l    dp_Arg1(a4),a2        ;a2=lock
  1245.     move.l    dp_Arg2(a4),d1        ;d1=position
  1246.     move.l    dp_Arg3(a4),d2        ;d2=mode
  1247. ;    clr.w    (dp_Res2+2,a4)
  1248.     move.l    myl_Pos(a2),d3        ;d3=old pos
  1249.     move.l    myl_Size(a2),d4        ;d4=size
  1250.  
  1251.     moveq    #OFFSET_BEGINNING,d0
  1252.     cmp.l    d0,d2
  1253.     beq.s    .E
  1254.     moveq    #OFFSET_END,d0
  1255.     cmp.l    d0,d2
  1256.     bne.s    .C
  1257.     add.l    d4,d1
  1258.     bra.s    .E
  1259. .C    moveq    #OFFSET_CURRENT,d0
  1260.     cmp.l    d0,d2
  1261.     bne.s    .fail
  1262.     add.l    d3,d1
  1263. .E    move.l    d1,myl_Pos(a2)
  1264.     bmi.s    .A
  1265.     cmp.l    d1,d4
  1266.     bhs.s    Seeek
  1267.     move.l    d4,myl_Pos(a2)
  1268.     bra.s    .fail
  1269. .A    clr.l    myl_Pos(a2)
  1270. .fail    move.w    #ERROR_SEEK_ERROR,(dp_Res2+2,a4)
  1271.     moveq    #-1,d3
  1272.  
  1273. Seeek    tst.b    myl_Mode(a2)    ;label not used globally
  1274.     bpl.s    .A
  1275.     move.l    myl_Pos(a2),d2
  1276.     move.l    myl_Start(a2),d0
  1277.     beq.s    .A
  1278.     bra.s    .E
  1279. .D    move.l    (a0),d0
  1280.     beq.s    .C
  1281. .E    move.l    d0,a0
  1282.     move.l    4(a0),d1
  1283.     sub.l    d1,d2
  1284.     beq.s    .F
  1285.     bpl.s    .D
  1286. .F    add.l    d1,d2
  1287. .C    move.l    a0,myl_Block(a2)
  1288.     move.l    d2,myl_BlockPos(a2)
  1289. .A    move.l    d3,dp_Res1(a4)
  1290.     DBUG1    txseek,myl_Pos(a2)
  1291. _ret3    rts
  1292.  
  1293. ADeleteObject:
  1294.     move.w    #ERROR_DISK_WRITE_PROTECTED,(dp_Res2+2,a4)
  1295.     tst.b    WriteProtected(a5)
  1296.     bne.s    _ret3
  1297.     move.w    #ERROR_OBJECT_NOT_FOUND,(dp_Res2+2,a4)
  1298.     move.l    dp_Arg1(a4),d0
  1299.     move.l    dp_Arg2(a4),a0
  1300.     bsr    SearchObject
  1301.     beq    _ret3
  1302.     movea.l    d0,a0
  1303.     move.w    #ERROR_DELETE_PROTECTED,(dp_Res2+2,a4)
  1304.     btst    #FIBB_DELETE,(myf_Attrs,a0)
  1305.     bne    _ret3
  1306.     movem.l    d0-d1,-(sp)
  1307.     moveq    #1,d0
  1308.     bsr    NotifyObject
  1309.     movem.l    (sp)+,d0-d1
  1310.     move.l    d0,a1
  1311.     move.l    (myf_Parent,a1),-(sp)
  1312.     bsr    DeleteObject
  1313.     movea.l    (sp)+,a1
  1314.     beq.s    _ret3
  1315.     bsr    SetCurrentDate
  1316.     bra    NoAction
  1317.  
  1318. ARenameObject:
  1319.     move.w    #ERROR_DISK_WRITE_PROTECTED,(dp_Res2+2,a4)
  1320.     tst.b    WriteProtected(a5)
  1321.     bne    _ret4
  1322.     move.w    #ERROR_OBJECT_NOT_FOUND,(dp_Res2+2,a4)
  1323.     move.l    dp_Arg1(a4),d0
  1324.     move.l    dp_Arg2(a4),a0
  1325.     bsr    SearchObject
  1326.     beq    _ret4
  1327.     move.l    d0,a3
  1328.     move.l    d1,d3
  1329.     move.w    #ERROR_OBJECT_IN_USE,(dp_Res2+2,a4)
  1330.     tst.b    myf_Locks(a3)
  1331.     bne    _ret4
  1332.     move.l    a3,a0
  1333.     bsr    NotifyObject
  1334.     move.w    #ERROR_OBJECT_EXISTS,(dp_Res2+2,a4)
  1335.     move.l    dp_Arg3(a4),d0
  1336.     move.l    dp_Arg4(a4),a0
  1337.     bsr    SearchObject
  1338.     bne    _ret4
  1339.     bsr    SplitPath
  1340.     move.w    #ERROR_DIR_NOT_FOUND,(dp_Res2+2,a4)
  1341.     move.l    dp_Arg3(a4),d0
  1342.     bsr    SearchPath
  1343.     beq    _ret4
  1344.     move.l    a3,-(sp)
  1345.     moveq    #0,d2
  1346.     tst.b    myf_Type(a3)
  1347.     bpl.s    .D
  1348.     move.l    myf_Size(a3),d2
  1349. .D    move.l    d0,a3
  1350.     lea    TempName(a5),a2
  1351.     bsr    CreateNewObject
  1352.     move.l    (sp)+,a3
  1353.     beq.s    _ret4
  1354.     move.l    d0,a2
  1355.     move.b    myf_Type(a3),myf_Type(a2)
  1356.     bpl.s    .A
  1357.     move.l    a2,a1            ;rename file
  1358.     add.l    d1,a1
  1359.     move.l    a3,a0
  1360.     moveq    #0,d0
  1361.     move.b    myf_DataOffs(a3),d0
  1362.     add.l    d0,a0
  1363.     move.l    myf_Size(a3),d0
  1364.     sys    CopyMem
  1365.     bra.s    .C
  1366. .A    move.l    myf_First(a3),d0    ;rename dir
  1367.     clr.l    myf_First(a3)
  1368.     move.l    d0,myf_First(a2)
  1369.     beq.s    .C
  1370. .E    move.l    d0,a0
  1371.     move.l    a2,myf_Parent(a0)
  1372.     move.l    myf_Link(a0),d0
  1373.     bne.s    .E
  1374. .C    move.l    d3,d1            ;end rename
  1375.     move.l    a3,a1
  1376.     bsr    DeleteObject
  1377.     beq    _ret4
  1378.     move.l    a2,a0
  1379.     bsr    CheckNotify
  1380.     bra    NoAction
  1381.  
  1382. *******************************************************
  1383.  
  1384. * Here are subroutines for packets that deal with Locks. 
  1385.  
  1386. ALocateObject:
  1387.     move.l    dp_Arg1(a4),d0
  1388.     move.l    dp_Arg2(a4),a0
  1389.     move.l    dp_Arg3(a4),d2
  1390.     bsr    LocateObject
  1391.     lsr.l    #2,d0
  1392.     move.l    d0,dp_Res1(a4)
  1393. _ret4    rts
  1394.  
  1395. ADupLockFromFH:
  1396.     move.l    dp_Arg1(a4),d0
  1397.     bra.s    DupLock
  1398.  
  1399.  
  1400. * fixed ZERO lock -MM
  1401.  
  1402. ADuplicateLock:
  1403.     move.l    dp_Arg1(a4),d0
  1404.     lsl.l    #2,d0
  1405. DupLock    movea.l    d0,a0
  1406.     bne    .reg        ;regular non-ZERO lock
  1407.     movea.l    (RootLock,a5),a0
  1408. .reg    move.l    myl_Key(a0),a2
  1409.     moveq    #ACCESS_READ,d2
  1410.     bsr    CreateLock
  1411.     lsr.l    #2,d0
  1412.     move.l    d0,dp_Res1(a4)
  1413.     rts
  1414.  
  1415. AParentFromFH:
  1416.     move.l    dp_Arg1(a4),d0
  1417.     bra.s    ParentD
  1418. AParentDir:
  1419.     move.l    dp_Arg1(a4),d0
  1420.     lsl.l    #2,d0
  1421. ParentD    beq.s    .fail        ;label not used globally
  1422.     move.l    d0,a0
  1423.     move.l    myl_Key(a0),a2
  1424.     move.l    myf_Parent(a2),d0
  1425.     beq.s    .fail
  1426.     move.l    d0,a2
  1427.     moveq    #ACCESS_READ,d2
  1428.     bsr    CreateLock
  1429.     lsr.l    #2,d0
  1430.     move.l    d0,dp_Res1(a4)
  1431. .fail
  1432. _ret5    rts
  1433.  
  1434. AFreeLock:
  1435.     move.l    dp_Arg1(a4),d0
  1436.     beq.s    _ret5
  1437.     lsl.l    #2,d0
  1438.     move.l    d0,a1
  1439.     bsr    FreeLock
  1440.     bra    NoAction
  1441.  
  1442. ASameLock:
  1443.     IFND    rom
  1444.     tst.l    StupIcon(a5)
  1445.     bne    Unsupported
  1446.     ENDC
  1447.  
  1448.     move.l    dp_Arg1(a4),a0
  1449.     add.l    a0,a0
  1450.     add.l    a0,a0
  1451.     move.l    dp_Arg2(a4),a1
  1452.     add.l    a1,a1
  1453.     add.l    a1,a1
  1454.     move.l    myl_Key(a0),d0
  1455.     cmp.l    myl_Key(a1),d0
  1456.     bne    .dif
  1457.     moveq    #DOSTRUE,d1
  1458.     move.l    d1,dp_Res1(a4)
  1459. .dif    rts
  1460.  
  1461. AExamineFH:
  1462.     move.l    dp_Arg1(a4),a0
  1463.     bra.s    Exammi
  1464.  
  1465. AExamineObject:
  1466.     move.l    dp_Arg1(a4),a0
  1467.     add.l    a0,a0
  1468.     add.l    a0,a0
  1469. Exammi    move.l    myl_Key(a0),a0    ;label not used globally
  1470.     move.l    dp_Arg2(a4),a1
  1471.     add.l    a1,a1
  1472.     add.l    a1,a1
  1473.     DBUG1    txexam,a0
  1474.     move.l    a1,a2
  1475.     moveq    #fib_SIZEOF/4-1,d0
  1476. .D    clr.l    (a2)+
  1477.     dbra    d0,.D
  1478. * Fill FileInfoBlock (fib) with infos about the object
  1479. * Used by AExamineFH, AExamineObject and AExamineNext
  1480. * ENTRY: a0=file, a1=fib
  1481. ExamineObject:
  1482.     moveq    #1,d0
  1483.     tst.l    myf_Parent(a0)
  1484.     beq.s    .C            ;rootdir ?
  1485.  
  1486. ;    IFD    DEBUG
  1487. ;    btst    #6,myf_Type(a0)
  1488. ;    beq.s    .\@D            ;hidden file ?
  1489. ;    moveq    #-3,d0
  1490. ;    bra.s    .C
  1491. ;.\@D    ENDC
  1492.  
  1493.     moveq    #-3,d0
  1494.     tst.b    myf_Type(a0)
  1495.     bmi.s    .C            ;file ?
  1496.     moveq    #2,d0            ;dir
  1497. .C    moveq    #0,d1
  1498.     move.l    d0,fib_DirEntryType(a1)
  1499.     move.l    d0,fib_EntryType(a1)
  1500.     bpl.s    .A
  1501.     move.l    myf_Size(a0),d1        ;no file no size
  1502. .A    move.l    a0,fib_DiskKey(a1)
  1503.     move.l    d1,fib_Size(a1)        ;calc size
  1504.     add.l    #1023,d1
  1505.     lsr.l    #8,d1
  1506.     lsr.l    #2,d1
  1507.     move.l    d1,fib_NumBlocks(a1)
  1508.     moveq    #0,d0
  1509.     move.b    (myf_Attrs,a0),d0
  1510. ;    move.b    myf_Type(a0),d1
  1511. ;    btst    #5,d1            ;copied ? -> A
  1512. ;    beq.s    .F
  1513. ;    bset    #FIBB_ARCHIVE,d0
  1514. ;.F    btst    #4,d1            ;notify ? -> P
  1515. ;    beq.s    .G
  1516. ;    bset    #5,d0
  1517. ;.G
  1518. ;    IFD    DEBUG
  1519. ;    btst    #6,d1            ;hidden ? -> H
  1520. ;    beq.s    .\@J
  1521. ;    bset    #7,d0
  1522. ;.\@J    tst.b    myf_Locks(a0)
  1523. ;    beq.s    .\@H
  1524. ;    bmi.s    .\@I
  1525. ;    bset    #2,d0            ;read-locked ?  -> no W
  1526. ;    bra.s    .\@H
  1527. ;.\@I    bset    #3,d0            ;write-locked ? -> no R
  1528. ;.\@H    ENDC
  1529.  
  1530.     move.l    d0,fib_Protection(a1)
  1531.     move.l    (myf_Date+0,a0),fib_DateStamp+0(a1)
  1532.     move.l    (myf_Date+4,a0),fib_DateStamp+4(a1)
  1533.     move.l    (myf_Date+8,a0),fib_DateStamp+8(a1)
  1534.     lea    myf_Name(a0),a0
  1535.     DBUG1    txexan,a0
  1536.     lea    fib_FileName(a1),a1
  1537.     moveq    #106,d0
  1538.     bsr    CopyChar2BSTR
  1539.     bra    NoAction
  1540.  
  1541. AExamineNext:
  1542.     move.l    dp_Arg1(a4),a2
  1543.     add.l    a2,a2
  1544.     add.l    a2,a2
  1545.     move.l    dp_Arg2(a4),a1
  1546.     add.l    a1,a1
  1547.     add.l    a1,a1
  1548.     move.l    fib_DiskKey(a1),a0
  1549.     DBUG1    txexnx,a0
  1550.     cmp.l    myl_Key(a2),a0
  1551.     bne.s    .A
  1552.     move.w    #ERROR_OBJECT_WRONG_TYPE,(dp_Res2+2,a4)
  1553.     tst.b    myf_Type(a0)
  1554.     bmi    _ret6
  1555.     move.l    myf_First-myf_Link(a0),a0
  1556.     bra.s    .C
  1557. .A    move.l    myf_Link(a0),a0
  1558. .C    move.w    #ERROR_NO_MORE_ENTRIES,(dp_Res2+2,a4)
  1559.     move.l    a0,d0
  1560.     beq    _ret6
  1561.  
  1562.     IFND    DEBUG
  1563.     btst    #6,myf_Type(a0)
  1564.     bne.s    .A
  1565.     ENDC
  1566.  
  1567.     bra    ExamineObject
  1568.  
  1569. ADiskInfo1:
  1570.     move.l    dp_Arg1(a4),a0
  1571.     bra.s    DiskInfo
  1572. ADiskInfo2:
  1573.     move.l    dp_Arg2(a4),a0
  1574. * ENTRY: a0=buffer (BPTR)
  1575. DiskInfo:            ;label not used globally
  1576.     add.l    a0,a0
  1577.     add.l    a0,a0
  1578.     move.l    a0,a1
  1579.     moveq    #id_SIZEOF/4-1,d0
  1580. .D    clr.l    (a1)+
  1581.     dbra    d0,.D
  1582.  
  1583.     IFD    DEBUG
  1584.     move.l    NumLocks(a5),id_NumSoftErrors(a0)
  1585.     ENDC
  1586.  
  1587.     moveq    #ID_VALIDATED,d0
  1588.     tst.b    WriteProtected(a5)
  1589.     beq.s    .C
  1590.     moveq    #ID_WRITE_PROTECTED,d0
  1591. .C    move.l    d0,id_DiskState(a0)
  1592.     move.l    #1024,d1
  1593.     move.l    d1,id_BytesPerBlock(a0)
  1594.     lsr.l    #1,d1
  1595.     move.l    FileSize(a5),d0
  1596.     add.l    d1,d0
  1597.     lsr.l    #8,d0
  1598.     lsr.l    #2,d0
  1599.     move.l    d0,id_NumBlocksUsed(a0)
  1600.     move.l    TotalSize(a5),d0
  1601.     add.l    d1,d0
  1602.     lsr.l    #8,d0
  1603.     lsr.l    #2,d0
  1604.     bne.s    .A
  1605.     moveq    #1,d0
  1606. .A    move.l    d0,id_NumBlocks(a0)
  1607.     move.l    #"DOS"<<8,id_DiskType(a0)
  1608.     move.l    MyVolumeBPTR(a5),id_VolumeNode(a0)
  1609.     move.l    RootLock(a5),id_InUse(a0)
  1610.     bra    NoAction
  1611.  
  1612. ACreateDir:
  1613.     move.w    #ERROR_DISK_WRITE_PROTECTED,(dp_Res2+2,a4)
  1614.     tst.b    WriteProtected(a5)
  1615.     bne.s    .fail
  1616.     move.w    #ERROR_OBJECT_EXISTS,(dp_Res2+2,a4)
  1617.     move.l    dp_Arg1(a4),d0
  1618.     move.l    dp_Arg2(a4),a0
  1619.     bsr    SearchObject
  1620.     bne.s    .fail
  1621.     bsr    SplitPath
  1622.     move.w    #ERROR_DIR_NOT_FOUND,(dp_Res2+2,a4)
  1623.     move.l    dp_Arg1(a4),d0
  1624.     bsr    CreatePath
  1625.     beq.s    .fail
  1626.     move.l    d0,a3
  1627.     lea    TempName(a5),a2
  1628.     moveq    #0,d2
  1629.     bsr    CreateNewObject
  1630.     beq.s    .fail
  1631.     move.l    d0,a2
  1632.     clr.b    myf_Type(a2)
  1633.     moveq    #ACCESS_WRITE,d2
  1634.     bsr    CreateLock
  1635.     beq.s    .fail
  1636.     move.l    d0,a0
  1637.     lsr.l    #2,d0
  1638.     move.l    d0,dp_Res1(a4)
  1639.     move.l    myl_Key(a0),a0
  1640.     bsr    CheckNotify
  1641. .fail
  1642. _ret6    rts
  1643.  
  1644. *******************************************************
  1645.  
  1646. * Here are subroutines that deal with Locks and Filehandles
  1647.  
  1648. AFHfromLock:
  1649.     move.w    #ERROR_OBJECT_WRONG_TYPE,(dp_Res2+2,a4)
  1650.     move.l    dp_Arg2(a4),d0
  1651.     beq.s    _ret7
  1652.     lsl.l    #2,d0
  1653.     move.l    d0,a0
  1654.     move.l    myl_Key(a0),a0
  1655.     tst.b    myf_Type(a0)        ;do not open dirs
  1656.     bmi    OpnOld
  1657. _ret7    rts
  1658.  
  1659. AChangeMode:
  1660.     move.w    #ERROR_OBJECT_IN_USE,(dp_Res2+2,a4)
  1661.     move.l    dp_Arg1(a4),d0
  1662.     move.l    dp_Arg2(a4),a2
  1663.     moveq    #CHANGE_FH,d1
  1664.     cmp.l    d0,d1
  1665.     bne.s    .A
  1666.     move.l    dp_Arg1(a4),a3
  1667.     add.l    a3,a3
  1668.     add.l    a3,a3
  1669.     move.l    fh_Arg1(a3),d0
  1670.     beq.s    _ret7
  1671.     move.l    d0,a2
  1672.     bra.s    .C
  1673. .A    moveq    #CHANGE_LOCK,d1
  1674.     cmp.l    d0,d1
  1675.     bne.s    _ret7
  1676. .C    move.l    myl_Key(a2),a0
  1677.     move.b    myf_Locks(a0),d0
  1678.     move.l    dp_Arg3(a4),d2
  1679.     moveq    #ACCESS_WRITE,d1
  1680.     cmp.l    d1,d2
  1681.     bne.s    .D
  1682.     cmp.b    d0,d1
  1683.     beq.s    .ok
  1684.     cmp.b    #1,d0
  1685.     bne.s    _ret7
  1686.     move.b    d1,myf_Locks(a0)
  1687.     bra.s    .ok
  1688. .D    cmp.b    d0,d1
  1689.     bne.s    .E
  1690.     tst.l    myl_Start(a2)
  1691.     bne.s    _ret7
  1692.     move.b    #1,myf_Locks(a0)
  1693. .E    moveq    #ACCESS_READ,d1
  1694. .ok    move.l    d1,myl_Access(a2)
  1695.     bra    NoAction
  1696.  
  1697. *******************************************************
  1698.  
  1699. * Here are subroutines for notification support
  1700. ;    dc.b    'addn'
  1701. AAddNotify:
  1702.     move.w    #ERROR_NO_FREE_STORE,(dp_Res2+2,a4)
  1703.     move.l    dp_Arg1(a4),a3
  1704.     clr.l    (nr_MsgCount,a3)    ;only one notify per NR allowed
  1705.     moveq    #myn_Name,d0
  1706.     move.l    nr_FullName(a3),a0
  1707. .C    addq.l    #1,d0
  1708.     tst.b    (a0)+
  1709.     bne.s    .C
  1710.     bsr    AllocMem
  1711.     beq    _ret8
  1712.     move.l    d0,a2
  1713.     lea    NotifyList(a5),a0
  1714.     move.l    (a0),myn_Link(a2)
  1715.     move.l    a2,(a0)
  1716.     move.l    a3,myn_Request(a2)
  1717.     move.l    nr_FullName(a3),a0
  1718.     lea    myn_Name(a2),a1
  1719. .D    move.b    (a0)+,(a1)+
  1720.     bne.s    .D
  1721.     bsr    UpNoti
  1722.  
  1723.     IFD    DEBUG
  1724.     lea    myn_Name(a2),a0
  1725.     DBUG4    txanoti,a2,a3,a0,d0
  1726.     ENDC
  1727.  
  1728.     btst    #NRB_NOTIFY_INITIAL,(nr_Flags+3,A3)    ;initial notify ?
  1729.     beq    .A
  1730.     tst.l    d0
  1731.     beq.s    .A
  1732. ;    move.l    d0,a0
  1733. ;    btst    #6,myf_Type(a0)        ;file really exists ?
  1734. ;    bne.s    .A
  1735.     bsr    SendNotify
  1736. .A    bra    NoAction
  1737.  
  1738. ARemoveNotify:    movea.l    (dp_Arg1,A4),A2
  1739.     move.w    #ERROR_OBJECT_NOT_FOUND,(dp_Res2+2,a4)
  1740.     lea    NotifyList(a5),a1
  1741. .A    move.l    (a1),d0
  1742.     beq    _ret8
  1743.     move.l    a1,a0
  1744.     move.l    d0,a1
  1745.     cmp.l    myn_Request(a1),a2
  1746.     bne.s    .A
  1747.     move.l    myn_Link(a1),myn_Link(a0)
  1748.     DBUG2    txrnoti,a1,a2
  1749.     move.l    myn_Key(a1),d0
  1750.     beq.s    .D
  1751.     move.l    d0,a0
  1752.     bclr    #4,myf_Type(a0)
  1753. .D    moveq    #myn_Name,d0
  1754.     lea    myn_Name(a1),a0
  1755. .C    addq.l    #1,d0
  1756.     tst.b    (a0)+
  1757.     bne.s    .C
  1758.     bsr    FreeMem
  1759.     bra    NoAction
  1760.  
  1761. * Update myn_Key of notification list, mainly used by CheckNotify
  1762. UpdateNotify:
  1763.     move.l    a2,-(sp)
  1764.     lea    NotifyList(a5),a2
  1765.     bra.s    .A
  1766. .C    move.l    d0,a2
  1767.     tst.l    myn_Key(a2)
  1768.     bne.s    .A
  1769.     bsr.s    UpNoti
  1770.  
  1771.     IFD    DEBUG
  1772.     beq.s    .\@A
  1773.     lea    myn_Name(a2),a0
  1774.     DBUG2    txunoti,a0,d0
  1775. .\@A    ENDC
  1776.  
  1777. .A    move.l    (a2),d0
  1778.     bne.s    .C
  1779.     move.l    (sp)+,a2
  1780. _ret8    rts
  1781.  
  1782. * Subroutine used by UpdateNotify and AddNotify
  1783. UpNoti    lea    myn_Name(a2),a0
  1784.     lea    TempPath(a5),a1
  1785.     move.l    #MAXPATH-1,d0
  1786.     bsr    CopyChar2Char
  1787.     moveq    #0,d0
  1788.     bsr    SearchPath
  1789.     bne.s    .A
  1790.     moveq    #0,d0
  1791.     bsr    CalcFullName
  1792. .A    move.l    d0,myn_Key(a2)
  1793.     beq.s    .D
  1794.     move.l    d0,a0
  1795.     bset    #4,myf_Type(a0)
  1796. .D    rts
  1797.  
  1798. * Update notification list, check it for file/dir and parent dir
  1799. * and notify them.
  1800. * ENTRY: a0=file
  1801. CheckNotify:
  1802.     move.l    a0,-(sp)
  1803.  
  1804.     IFD    DEBUG
  1805.     lea    myf_Name(a0),a0
  1806.     DBUG1    txcnoti,a0
  1807.     ENDC
  1808.  
  1809.     bsr    UpdateNotify
  1810.     move.l    (sp)+,a0
  1811.  
  1812. * Check notification list for file/dir and parent dir and notify them.
  1813. * ENTRY: a0=file
  1814. NotifyObject:
  1815.     cmpi.l    #ACTION_END,(dp_Type,a4)
  1816.     bne    \ok
  1817.     moveq    #3,d0
  1818.     btst    d0,(myf_Type,a0)
  1819.     beq    .E
  1820.     bclr    d0,(myf_Type,a0)
  1821.     bsr    NotifyObj
  1822.     movea.l    myf_Parent(a0),a0
  1823. \ok    bsr    NotifyObj
  1824. .E    rts
  1825.  
  1826. * Notify object in a0, only used by NotifyObject
  1827. NotifyObj:
  1828.     movem.l    a2/a3,-(sp)
  1829.     lea    NotifyList(a5),a2
  1830.     bra.s    .A
  1831.  
  1832. .C    move.l    d0,a2
  1833.     cmp.l    myn_Key(a2),a0
  1834.     bne.s    .A
  1835.     move.l    a0,-(sp)
  1836.     move.l    myn_Request(a2),a3
  1837.     bsr    SendNotify
  1838.     move.l    (sp)+,a0
  1839. .A    move.l    (a2),d0
  1840.     bne.s    .C
  1841.     movem.l    (sp)+,a2/a3
  1842.     rts
  1843.  
  1844. * Send a Notify message or set a Notify signal
  1845. * ENTRY: a3=NotifyRequest
  1846. SendNotify:
  1847.     moveq    #NRB_SEND_SIGNAL,d0    ;moveq    #1,d0
  1848.     btst    d0,nr_Flags+3(a3)
  1849.     beq.s    .C
  1850.     move.l    nr_Task(a3),a1
  1851.  
  1852.     IFD    DEBUG
  1853.     move.l    LN_NAME(a1),d0
  1854.     lea    myn_Name(a2),a0
  1855.     DBUG2    txsnoti,d0,a0
  1856.     ENDC
  1857.  
  1858.     move.b    nr_SignalNum(a3),d1
  1859.     asl.l    d1,d0
  1860.     sys    Signal
  1861.     rts
  1862.  
  1863. .C    btst    #NRB_SEND_MESSAGE,nr_Flags+3(a3)
  1864.     beq    .D
  1865.     moveq    #NotifyMessage_SIZEOF,d0
  1866.     bsr    AllocMem
  1867.     beq    .D
  1868.     move.l    d0,a0
  1869.     move.l    d0,a1
  1870.     moveq    #NotifyMessage_SIZEOF/2-1,d0
  1871. .A    clr.w    (a0)+
  1872.     dbra    d0,.A
  1873.     move.b    #NT_MESSAGE,LN_TYPE(a1)
  1874.     movea.l    NotifyPort(a5),a0
  1875.     move.l    a0,MN_REPLYPORT(a1)
  1876.     move.w    #NotifyMessage_SIZEOF,MN_LENGTH(a1)
  1877.     move.l    #$40000000,nm_Class(a1)
  1878.     move.w    #$1234,nm_Code(a1)
  1879.     move.l    a3,nm_NReq(a1)
  1880.  
  1881.     IFD    DEBUG
  1882.     move.l    a2,-(sp)
  1883.     move.l    nr_Port(a3),a0
  1884.     move.l    MP_SIGTASK(a0),a0
  1885.     move.l    LN_NAME(a0),a0
  1886.     lea    myn_Name(a2),a2
  1887.     DBUG3    txmnoti,a1,a0,a2
  1888.     move.l    (sp)+,a2
  1889.     ENDC
  1890.  
  1891.     move.l    nr_Port(a3),a0
  1892.     sys    PutMsg
  1893.     addq.l    #1,nr_MsgCount(a3)
  1894. ;    btst    #NRB_WAIT_REPLY,nr_Flags+3(a3)
  1895. ;    beq.s    .D
  1896. ;    lea    NotifyPort(a5),a0
  1897. ;    sys    WaitPort
  1898. ;    bsr    GetNotify
  1899. .D    rts
  1900.  
  1901. *******************************************************
  1902.  
  1903. *******************************************************
  1904.  
  1905. * Following there are support subroutines for creating and deleting
  1906. * objects and Locks.
  1907.  
  1908. * Create a new file/dir
  1909. * ENTRY: a2=name, a3=parent dir, d2=data size, a5=global data ptr, a6=exec
  1910. * EXIT:  d1=offset of data, d0=new file, Z-flag for success
  1911. CreateNewObject:
  1912.     move.w    #ERROR_DISK_FULL,(dp_Res2+2,a4)
  1913. CreateNewObj:        ;label used by SearchPath and CalcFullName
  1914.     movem.l    d3/a2-a3,-(sp)
  1915.     move.l    a2,a0
  1916.     moveq    #myf_Name,d3
  1917. .D    addq.l    #1,d3
  1918.     tst.b    (a0)+
  1919.     bne.s    .D
  1920.     addq.l    #1,d3
  1921.     bclr    #0,d3
  1922.     move.l    d3,d0
  1923.     add.l    d2,d0
  1924.     bsr    AllocMem
  1925.     beq    _ret9
  1926.     move.l    d0,a1
  1927.     lea    myf_First(a3),a0
  1928. .C    move.l    (a0),d0
  1929.     beq.s    .A
  1930.     move.l    d0,a0
  1931.     bra.s    .C
  1932. .A    move.l    a1,(a0)
  1933.     clr.l    myf_Link(a1)
  1934.     move.l    a3,myf_Parent(a1)
  1935.     move.l    d2,myf_Size(a1)
  1936.     add.l    d2,FileSize(a5)
  1937.     bsr    SetCurrentDate
  1938.     move.b    #$80,myf_Type(a1)
  1939.     move.b    d3,myf_DataOffs(a1)
  1940.     clr.b    myf_Locks(a1)
  1941.     clr.b    (myf_Attrs,a1)
  1942.     lea    myf_Name(a1),a0
  1943. .E    move.b    (a2)+,(a0)+
  1944.     bne.s    .E
  1945.     move.l    d3,d1
  1946.     move.l    a1,d0
  1947. .fail
  1948.     IFD    DEBUG
  1949.     move.l    d0,-(sp)
  1950.     lea    myf_Name(a1),a2
  1951.     move.l    myf_Size(a1),d0
  1952.     DBUG3    txcreat,a2,a1,d0
  1953.     move.l    (sp)+,d0
  1954.     ENDC
  1955.  
  1956.     movem.l    (sp)+,d3/a2-a3
  1957. _ret9    rts
  1958.  
  1959. ASetProtect:    moveq    #0,d2
  1960.     bra    _set
  1961. ASetDate:    moveq    #1,d2
  1962. _set    move.w    #ERROR_DISK_WRITE_PROTECTED,(dp_Res2+2,a4)
  1963.     tst.b    (WriteProtected,a5)
  1964.     bne    _ret9
  1965.     move.w    #ERROR_OBJECT_NOT_FOUND,(dp_Res2+2,a4)
  1966.     move.l    dp_Arg2(a4),d0
  1967.     move.l    dp_Arg3(a4),a0
  1968.     bsr    SearchObject
  1969.     beq.s    _ret9
  1970.     movea.l    d0,a0        ;File
  1971.     movea.l    (dp_Arg4,a4),a2
  1972.     tst.l    d2
  1973.     bne    .date
  1974.     move.l    a2,d1
  1975.     move.b    d1,(myf_Attrs,a0)
  1976.     bra    .done
  1977. .date    lea    (myf_Date,a1),a1
  1978.     move.l    (a2)+,(a1)+
  1979.     move.l    (a2)+,(a1)+
  1980.     move.l    (a2)+,(a1)+
  1981. .done    bsr    CheckNotify
  1982.     bra    NoAction
  1983.  
  1984.  
  1985. * Get curent DateStamp
  1986. * ENTRY: a1=file or ZERO
  1987.  
  1988. SetCurrentDate:
  1989. .regs    reg    a0/a1/a6
  1990.     movem.l    .regs,-(sp)
  1991.     move.l    a1,d1
  1992.     bne    .is
  1993.     lea    (RootDir,a5),a1
  1994. .is    lea    (myf_Date,a1),a1
  1995.     move.l    a1,d1
  1996.     movea.l    (DosBase,a5),a6
  1997.     sys    DateStamp
  1998.     movem.l    (sp)+,.regs
  1999.     rts
  2000.  
  2001. * Delete file/dir in a1, no pred. known
  2002. * ENTRY: a1=file a4=packet
  2003. * EXIT:  d0=success, Z-flag
  2004. DeleteObj:
  2005.     move.w    #ERROR_OBJECT_NOT_FOUND,(dp_Res2+2,a4)
  2006.     move.l    myf_Parent(a1),a0
  2007.     move.l    myf_First(a0),d0
  2008.     sub.l    a0,a0
  2009. .C    move.l    a0,d1
  2010.     move.l    d0,a0
  2011.     tst.l    d0
  2012.     beq    DelErr
  2013.     move.l    myf_Link(a0),d0
  2014.     cmp.l    a1,a0
  2015.     bne.s    .C
  2016.  
  2017. * Delete file/dir in a1 with pred. known
  2018. * ENTRY: a1=file d1=pred a4=packet
  2019. DeleteObject:
  2020.     move.l    d2,-(sp)
  2021.     moveq    #0,d0
  2022.     move.w    #ERROR_OBJECT_IN_USE,(dp_Res2+2,a4)
  2023.     tst.b    myf_Locks(a1)
  2024.     bne.s    .fail
  2025.     tst.b    myf_Type(a1)
  2026.     bmi.s    .C
  2027.     move.w    #ERROR_DIRECTORY_NOT_EMPTY,(dp_Res2+2,a4)
  2028.     tst.l    myf_First(a1)        ;check if dir is empty
  2029.     bne.s    .fail
  2030. .C    move.l    myf_Link(a1),d2        ;rearrange links
  2031.     move.l    d1,a0
  2032.     tst.l    d1
  2033.     bne.s    .A
  2034.     move.w    #ERROR_OBJECT_WRONG_TYPE,(dp_Res2+2,a4)
  2035.     move.l    myf_Parent(a1),d1
  2036.     beq.s    .fail            ;do not delete root
  2037.     move.l    d1,a0
  2038.     lea    myf_First-myf_Link(a0),a0
  2039. .A    move.l    d2,myf_Link(a0)
  2040.     DBUG1    txdel,a1
  2041.     lea    NotifyList(a5),a0
  2042.     bra.s    .D
  2043. .E    move.l    d0,a0
  2044.     cmp.l    myn_Key(a0),a1
  2045.     bne.s    .D
  2046.     clr.l    myn_Key(a0)        ;check notifications
  2047. .D    move.l    (a0),d0
  2048.     bne.s    .E
  2049. ;    moveq    #0,d0            ;free memory
  2050.     move.b    myf_DataOffs(a1),d0
  2051.     move.l    myf_Size(a1),d1
  2052.     add.l    d1,d0
  2053.     sub.l    d1,FileSize(a5)
  2054.     bsr    FreeMem
  2055.     moveq    #1,d0
  2056. .fail    move.l    (sp)+,d2
  2057. DelErr    tst.l    d0        ;label not used globally
  2058.     rts
  2059.  
  2060. * Create lock on file/dir given by name
  2061. * Must preserve a3
  2062. * ENTRY: d0=BPTR parent lock, a0=name (BSTR), d2=access mode
  2063. * EXIT:  d0=APTR lock, Z-flag
  2064. LocateObject:
  2065.     move.w    #ERROR_OBJECT_NOT_FOUND,(dp_Res2+2,a4)
  2066.     move.l    d0,d3
  2067.     bsr    SearchObject
  2068.     bne.s    .A
  2069.     moveq    #ACCESS_WRITE,d0
  2070.     sub.l    d2,d0
  2071.     beq    LOfail2
  2072.     move.l    d3,d0
  2073.     bsr    CalcFullName
  2074.     beq    LOfail2
  2075. .A    movea.l    d0,a2
  2076.  
  2077. * Create lock on file/dir given by key
  2078. * ENTRY: a2=file, d2=access mode
  2079. * EXIT:  d0=success, Z-flag
  2080. CreateLock:
  2081.     moveq    #0,d0
  2082.     move.w    #ERROR_OBJECT_IN_USE,(dp_Res2+2,a4)
  2083.     lea    myf_Locks(a2),a0
  2084.     moveq    #ACCESS_WRITE,d1
  2085.     cmp.l    d1,d2
  2086.     bne.s    .A
  2087.     tst.b    (a0)
  2088.     bne.s    LOfail
  2089.     move.b    d1,(a0)
  2090.     bra.s    .C
  2091. .A    tst.b    (a0)
  2092.     bmi.s    LOfail
  2093.     addq.b    #1,(a0)
  2094. .C    move.w    #ERROR_NO_FREE_STORE,(dp_Res2+2,a4)
  2095.     move.l    #myl_SIZEOF,d0
  2096.     bsr    AllocMem
  2097.     beq.s    LOfail
  2098.     move.l    d0,a0
  2099.     clr.l    (a0)+        ;clr.l    myl_Link(a0)
  2100.     move.l    a2,(a0)+    ;myl_Key(a0)
  2101.     move.l    d2,(a0)+    ;myl_Access(a0)
  2102.     move.l    MyMsgPort(a5),(a0)+    ;myl_Task(a0)
  2103.     move.l    MyVolumeBPTR(a5),(a0)+    ;myl_Volume(a0)
  2104.     clr.l    (a0)+        ;myl_Pos(a0)
  2105.     clr.l    (a0)+        ;myl_Data(a0)
  2106.     clr.l    (a0)+        ;myl_Start(a0)
  2107.     clr.l    (a0)+        ;myl_Block(a0)
  2108.     clr.l    (a0)+        ;myl_BlockPos(a0)
  2109.     clr.l    (a0)+        ;myl_Size(a0)
  2110.     clr.b    (a0)        ;myl_Mode(a0)
  2111.     addq.l    #1,NumLocks(a5)
  2112. LOfail
  2113.     IFD    DEBUG
  2114.     move.l    d0,d1
  2115.     lsr.l    #2,d1
  2116.     lea    myf_Name(a2),a0
  2117.     DBUG3    txlock,a0,d1,d2
  2118.     ENDC
  2119.  
  2120. LOfail2    tst.l    d0
  2121.     rts
  2122.  
  2123. * Free lock in a1
  2124. * ENTRY: a1=lock (APTR)
  2125. FreeLock:
  2126. ;    move.w    #ERROR_UNLOCK_ERROR,(dp_Res2+2,a4)
  2127.  
  2128.     IFD    DEBUG
  2129.     move.l    a1,d0
  2130.     lsr.l    #2,d0
  2131.     DBUG1    txulock,d0
  2132.     ENDC
  2133.  
  2134.     move.l    myl_Key(a1),a0
  2135.     tst.b    myf_Locks(a0)
  2136.     beq.s    .A
  2137.     bmi.s    .D
  2138.     subq.b    #1,myf_Locks(a0)
  2139.     bra.s    .A
  2140. .D    clr.b    myf_Locks(a0)
  2141. .A    move.l    #myl_SIZEOF,d0
  2142.     bsr    FreeMem
  2143.     subq.l    #1,NumLocks(a5)
  2144.     rts
  2145.  
  2146. *******************************************************
  2147.  
  2148. *******************************************************
  2149.  
  2150. * Support routines for lower level memory management
  2151.  
  2152. * ENTRY: d0=size
  2153. * EXIT:  d0=memory/Z flag
  2154. AllocMem:
  2155.     add.l    d0,TotalSize(a5)
  2156.     move.l    MyMemPool(a5),d1
  2157.     beq.s    .A
  2158.     move.l    d1,a0
  2159.     sys    AllocPooled
  2160.     tst.l    d0
  2161.     rts
  2162. .A    moveq    #MEMF_PUBLIC,d1
  2163.     add.l    #MN_SIZE,d0
  2164.     sys    AllocVec
  2165.     tst.l    d0
  2166.     beq    .ret
  2167.     lea    (MyML,a5),a0    ;add alloc to our list
  2168.     movea.l    d0,a1
  2169.     move.l  (a0),d1
  2170.     move.l  a1,(a0)
  2171.     movem.l d1/a0,(a1)
  2172.     move.l  d1,a0
  2173.     move.l  a1,(LN_PRED,a0)
  2174.     add.l    #MN_SIZE,d0
  2175. .ret    rts
  2176.  
  2177. * ENTRY: d0=size, a1=address
  2178. FreeMem:
  2179.     sub.l    d0,TotalSize(a5)
  2180.     move.l    MyMemPool(a5),d1
  2181.     beq.s    .A
  2182.     move.l    d1,a0
  2183.     sys    FreePooled
  2184.     rts
  2185. .A    suba.w    #MN_SIZE,a1
  2186. _free    move.l    a1,d1
  2187.     REMOVE        ;remove alloc from our list
  2188.     movea.l    d1,a1
  2189.     sys    FreeVec
  2190.     rts
  2191.  
  2192. * Copy BSTR in a0 to string in a1, d0=maxlength without 0
  2193. CopyBSTR2Char:
  2194.     add.l    a0,a0
  2195.     add.l    a0,a0
  2196.     moveq    #0,d1
  2197.     move.b    (a0)+,d1
  2198.     MIN    d0,d1,D
  2199.     bra.s    .C
  2200. .A    move.b    (a0)+,(a1)+
  2201. .C    dbra    d1,.A
  2202.     clr.b    (a1)
  2203.     rts
  2204.  
  2205. * Copy string in a0 to BSTR in a1, d0=maxlength without 0
  2206. * EXIT:  d0=BPTR
  2207. CopyChar2BSTR:
  2208.     moveq    #-1,d1
  2209.     addq.l    #1,a1
  2210. .A    addq.l    #1,d1
  2211.     cmp.l    d0,d1
  2212.     bhs.s    .C
  2213.     move.b    (a0)+,(a1)+
  2214.     bne.s    .A
  2215.     subq.l    #1,a1
  2216. .C    clr.b    (a1)
  2217.     sub.l    d1,a1
  2218.     subq.l    #1,a1
  2219.     move.b    d1,(a1)
  2220.     move.l    a1,d0
  2221.     lsr.l    #2,d0
  2222.     rts
  2223.  
  2224. CopyChar2Char:
  2225. * Copy string in a0 to string in a1, d0=maxlength without 0
  2226. .C    move.b    (a0)+,(a1)+
  2227.     beq.s    .A
  2228.     subq.l    #1,d0
  2229.     bne.s    .C
  2230. .A    rts
  2231.  
  2232.  
  2233. *******************************************************
  2234.  
  2235. *******************************************************
  2236.  
  2237. * Subroutines for path string handling following
  2238.  
  2239. * Same as SearchObject, but deletes hidden files
  2240. * ENTRY: a0=filename (BSTR), d0=lock on dir
  2241. * EXIT:  d0=ptr to file, Z-flag, d1=previous file, TempPath=name
  2242. ;DelSearchObject
  2243. ;    bsr    SearchObject
  2244. ;    beq.s    .A
  2245. ;    move.l    d0,a1
  2246. ;    btst    #6,myf_Type(a1)
  2247. ;    beq.s    .A
  2248. ;    bsr    DeleteObject        ;delete hidden file
  2249. ;    moveq    #0,d0
  2250. ;.A    tst.l    d0
  2251. ;    rts
  2252.  
  2253. * Same as SearchPath, but creates the path if not existent
  2254. * ENTRY: TempPath=dirname, d0=lock on dir
  2255. * EXIT:  d0=ptr to file, Z-flag, d1=previous file
  2256. CreatePath:
  2257.     moveq    #1,d1
  2258.     bra.s    SearchP
  2259.  
  2260. * Look for object with path
  2261. * ENTRY: a0=filename (BSTR), d0=lock on dir
  2262. * EXIT:  d0=ptr to file, Z-flag, d1=previous file, TempPath=name
  2263. SearchObject:
  2264.     move.l    d0,-(sp)
  2265.     lea    TempPath(a5),a1
  2266.     move.l    #MAXPATH-1,d0
  2267.     bsr    CopyBSTR2Char
  2268.     move.l    (sp)+,d0
  2269.  
  2270. * Same as SearchObject, but name is already copied to TempPath
  2271. * ENTRY: TempPath=dirname, d0=lock on dir
  2272. * EXIT:  d0=ptr to file, Z-flag, d1=previous file
  2273. SearchPath:
  2274.     moveq    #0,d1
  2275. SearchP    movem.l    d2-d7/a2-a4,-(sp)    ;label not used globally
  2276.     move.l    d1,d7
  2277.     lea    TempPath(a5),a0
  2278. .A    move.b    (a0)+,d1
  2279.     beq    .B
  2280.     cmp.b    #":",d1            ;skip volume name
  2281.     bne    .A
  2282. .B    tst.l    d0
  2283.     bne    .C
  2284.     move.l    (RootLock,a5),d0
  2285.     lsr.l    #2,d0
  2286. .C    tst.b    d1
  2287.     bne    .D
  2288.     lea    TempPath(a5),a0
  2289. .D    lsl.l    #2,d0            ;use root or locked dir
  2290.     movea.l    d0,a2
  2291.     move.l    (myl_Key,a2),a1        ;dir represented by lock
  2292.  
  2293. * label not used
  2294. expand
  2295.  
  2296. * label not used
  2297. * ENTRY: a0=Name, a1=parent dir; mind SP !
  2298. * EXIT:  d0=ptr to file, Z-flag, d1=previous file
  2299. SearchName:
  2300. .A    moveq    #0,d0
  2301. .D    cmp.b    #"/",(a0)        ;parent dir when starting with /
  2302.     bne.s    .H
  2303.     move.l    myf_Parent(a1),d2
  2304.     beq.s    .fail
  2305.     move.l    d2,a1
  2306.     addq.l    #1,a0
  2307.     bra.s    .D
  2308. .H    tst.b    (a0)            ;check for empty string
  2309.     beq.s    .G
  2310.     move.l    a0,a4
  2311.     moveq    #0,d3
  2312. .C    addq.l    #1,d3            ;look for / or end
  2313.     tst.b    (a4)
  2314.     beq.s    .E
  2315.     cmp.b    #":",(a4)
  2316.     beq.s    .fail
  2317.     cmp.b    #"/",(a4)+
  2318.     bne.s    .C
  2319. .E    tst.b    myf_Type(a1)
  2320.     bmi.s    .fail
  2321.     move.l    a1,d2
  2322.     bsr    SearchEntry        ;search in dir
  2323.     bne.s    .F
  2324.     tst.l    d7            ;check for CreatePath
  2325.     beq.s    .G
  2326.     movem.l    d1-d3/a0/a2-a4,-(sp)
  2327.     move.l    d2,a3
  2328.     move.l    a0,a2
  2329.     move.l    a0,a4
  2330.     subq.l    #1,d3
  2331.     add.l    d3,a4
  2332.     move.b    (a4),d3
  2333.     clr.b    (a4)
  2334.     moveq    #0,d2
  2335.     bsr    CreateNewObj        ;create new dir
  2336.     move.b    d3,(a4)
  2337. ;    move.l    d0,a1
  2338.     movem.l    (sp)+,d1-d3/a0/a2-a4
  2339.     tst.l    d0
  2340.     beq.s    .I
  2341.     clr.b    myf_Type(a1)
  2342. .F    move.l    a4,a0
  2343.     bra.s    .A            ;continue looking for / or end
  2344. .G    move.l    a1,d0
  2345. .fail
  2346.     IFD    DEBUG
  2347.     lea    TempPath(a5),a0
  2348.     moveq    #0,d2
  2349.     tst.l    d0
  2350.     beq.s    .\@I
  2351.     move.b    myf_Type(a1),d2
  2352. .\@I    DBUG3    txfnd,a0,d0,d2
  2353.     ENDC
  2354.  
  2355. .I    movem.l    (sp)+,d2-d7/a2-a4
  2356.     tst.l    d0
  2357.     rts
  2358.  
  2359. * Look for object in dir
  2360. * ENTRY: a0=file/dir name, a1=ptr to dir, d3=length of name
  2361. * EXIT:  a1=ptr to file or 0, Z-flag
  2362. SearchEntry:
  2363.     moveq    #0,d5
  2364.     moveq    #0,d6
  2365.     move.l    myf_First(a1),d0
  2366.     sub.l    a1,a1
  2367. .C    move.l    a1,d1
  2368.     move.l    d0,a1
  2369.     tst.l    d0
  2370.     beq.s    .fail
  2371.     move.l    myf_Link(a1),d0
  2372.     lea    myf_Name(a1),a2
  2373.     move.l    a0,a3
  2374.     move.l    d3,d4
  2375.     bra.s    .E
  2376. .A    move.b    (a2)+,d5
  2377.     move.b    CharTable(a5,d5.l),d5
  2378.     move.b    (a3)+,d6
  2379.     move.b    CharTable(a5,d6.l),d6
  2380.     cmp.b    d5,d6
  2381.     bne.s    .C
  2382. .E    subq.l    #1,d4
  2383.     bne.s    .A
  2384.     tst.b    (a2)
  2385.     bne.s    .C
  2386.  
  2387.     IFD    DEBUG
  2388.     lea    myf_Name(a1),a3
  2389.     DBUG1    txentry,a3
  2390.     ENDC
  2391.  
  2392. .fail    move.l    a1,d0
  2393.     rts
  2394.  
  2395. * Splits path with file into path=TempPath and file=TempName
  2396. * ENRTY: TempPath=file with path
  2397. * EXIT:  TempPath=path, TempName=file
  2398. SplitPath
  2399.     move.l    a2,-(sp)
  2400.     lea    TempPath(a5),a0
  2401.     move.l    a0,a1
  2402. .A    tst.b    (a0)+
  2403.     bne.s    .A
  2404. .D    cmp.b    #"/",-(a0)
  2405.     beq.s    .C
  2406.     cmp.b    #":",(a0)
  2407.     beq.s    .C
  2408.     cmp.l    a0,a1
  2409.     bne.s    .D
  2410.     move.l    a0,a1
  2411.     bra.s    .G
  2412. .C    move.l    a0,a1
  2413.     addq.l    #1,a1
  2414. .G    lea    TempName(a5),a2
  2415. .E    move.b    (a1)+,(a2)+
  2416.     bne.s    .E
  2417.     cmp.b    #":",(a0)
  2418.     bne.s    .F
  2419.     addq.l    #1,a0
  2420. .F    clr.b    (a0)
  2421.     move.l    (sp)+,a2
  2422.  
  2423.     IFD    DEBUG
  2424.     lea    TempPath(a5),a0
  2425.     lea    TempName(a5),a1
  2426.     DBUG2    txsplit,a0,a1
  2427.     ENDC
  2428.  
  2429.     rts
  2430.  
  2431. * Evaluate full path name of object
  2432. * Only used by CalcFullName
  2433. * ENTRY: a1=object
  2434. * EXIT:  a0=full name (root name not included) in TempPath
  2435. GetFullName:
  2436.     move.l    d2,-(sp)
  2437.     lea    TempPath+MAXPATH+MAXNAME-1(a5),a0
  2438.     clr.b    (a0)
  2439.     move.w    #MAXPATH+MAXNAME-1,d2
  2440. .A    move.l    myf_Parent(a1),d0
  2441.     beq.s    .ok
  2442.     lea    myf_Name(a1),a1
  2443.     moveq    #-1,d1
  2444. .C    addq.l    #1,d1
  2445.     tst.b    (a1)+
  2446.     bne.s    .C
  2447.     subq.l    #1,a1
  2448.     sub.w    d1,d2
  2449.     bmi.s    .ok
  2450.     tst.b    (a0)
  2451.     beq.s    .D
  2452.     move.b    #"/",-(a0)
  2453.     subq.w    #1,d2
  2454.     bra.s    .D
  2455. .E    move.b    -(a1),-(a0)
  2456. .D    dbra    d1,.E
  2457.     move.l    d0,a1
  2458.     bra.s    .A
  2459. .ok    move.l    (sp)+,d2
  2460.     rts
  2461.  
  2462. * Create dir and copy file from ENVARC: if possible
  2463. * Only used by LocateObject and UpNoti
  2464. * ENTRY: TempPath=name, d0=BPTR parent lock
  2465. * EXIT: d0=file or ZERO
  2466. CalcFullName:
  2467. .regs    reg    d2-d7/a2-a4
  2468.     movem.l    .regs,-(sp)
  2469.     moveq    #0,d7            ;d7=return code
  2470.     tst.b    WriteProtected(a5)
  2471.     bne    .fail
  2472.  
  2473.     IFND    rom
  2474.     tst.l    StupNocopy(a5)
  2475.     bne    .fail
  2476.     ENDC
  2477.  
  2478.     move.l    d0,d2        ;BPTR to parent lock
  2479.     bsr    SearchPath
  2480.     bne    .found
  2481.     move.l    d2,d0
  2482.     bsr    CreatePath
  2483.     beq    .fail
  2484. .found    move.l    d0,a1
  2485.     move.l    d0,a2
  2486.     bsr    GetFullName
  2487.     DBUG1    txfull,a0
  2488.     lea    TempPath(a5),a1
  2489.     move.l    #MAXPATH-2,d0
  2490.     bsr    CopyChar2BSTR
  2491.     move.l    d0,d5            ;d5=BSTR full name
  2492.     lea    (MyMsg,a5),a1
  2493.     movem.l    d5/a2,(MN_SIZE,a1)
  2494.     movea.l    (DosPort,a5),a0
  2495.     sys    PutMsg
  2496.     movea.l    (PacketPort,a5),a0
  2497.     sys    WaitPort    
  2498.     movea.l    (PacketPort,a5),a0
  2499.     sys    GetMsg
  2500.     movea.l    d0,a0
  2501.     move.l    (MN_SIZE,a0),d7
  2502.     beq    .fail1
  2503.     move.l    (MN_SIZE+4,a0),(dp_Res2,a4)
  2504.     movea.l    d7,a1
  2505.     lea    (MyFIB,a5),a0
  2506.     move.b    (fib_Protection+3,a0),(myf_Attrs,a1)
  2507.     lea    (fib_DateStamp,a0),a0
  2508.     lea    (myf_Date,a1),a1
  2509.     move.l    (a0)+,(a1)+
  2510.     move.l    (a0)+,(a1)+
  2511.     move.l    (a0)+,(a1)+
  2512.     cmpa.l    d7,a2            ;if dir they're equal
  2513.     beq    .ok
  2514. .fail1    move.l    (dp_Res2,a4),d2
  2515.     move.l    a2,a1
  2516.     bsr    DeleteObj
  2517.     move.l    d2,(dp_Res2,a4)
  2518.     tst.l    d7
  2519.     beq    .fail
  2520. .ok    bsr    UpdateNotify
  2521. .fail    move.l    d7,d0
  2522.     movem.l    (sp)+,.regs
  2523. _perr    rts
  2524.  
  2525. * code of special sub-process for synchronous dos calls follows -MM
  2526.  
  2527. procc:    movea.l    (4).w,a6
  2528.     sys    CreateMsgPort
  2529.     move.l    d0,d7
  2530.     beq    _perr
  2531.     move.l    #1<<15,d0        ;wait for CTRL-F
  2532.     sys    Wait
  2533.     suba.l    a1,a1
  2534.     sys    FindTask
  2535.     movea.l    d0,a4
  2536.     movea.l    (TC_Userdata,a4),a5
  2537.     lea    (pr_MsgPort,a4),a4
  2538.     move.l    d7,(DosPort,a5)
  2539.     movea.l    (PacketPort,a5),a0
  2540.     moveq    #1,d0
  2541.     move.b    (MP_SIGBIT,a0),d1
  2542.     movea.l    (MP_SIGTASK,a0),a1
  2543.     lsl.l    d1,d0
  2544.     sys    Signal        ;signal parent we're ready
  2545.  
  2546. .mloop    movea.l    d7,a0
  2547.     sys    WaitPort
  2548.     movea.l    d7,a0
  2549.     sys    GetMsg
  2550.     movea.l    d0,a3
  2551.     lea    (MN_SIZE,a3),a0
  2552.     move.l    (a0)+,d4    ;BSTR of full object's name
  2553.     beq    .quit
  2554.     movea.l    (a0),a2        ;object
  2555.  
  2556. *-----------------------------------------------------
  2557. * perform synchronous DOS IO
  2558. * in: d4=BSTR of full object's name, a2 - object
  2559. * out: d0=new object or NULL, d5=NULL if read successfull, dp_Res2 otherwise
  2560.  
  2561. .regs    reg    d7/a3/a6
  2562.     movem.l    .regs,-(sp)
  2563.     movea.l    (DosBase,a5),a6
  2564.     moveq    #0,d6
  2565.     moveq    #0,d7
  2566.  
  2567. .loop    lea    (envarc,pc),a0
  2568.     move.l    a0,d1
  2569.     move.l    d6,d2
  2570.     sys    GetDeviceProc
  2571.     move.l    d0,d6
  2572.     beq    .fail
  2573.     move.l    d6,a4
  2574.     move.l    (dvp_Port,a4),d1        ;port
  2575.     moveq    #ACTION_LOCATE_OBJECT,d2    ;action
  2576.     move.l    (dvp_Lock,a4),d3        ;arg1
  2577.     moveq    #ACCESS_READ,d5            ;arg3
  2578.     sys    DoPkt
  2579.     move.l    d0,d3                ;d3=lock on object
  2580.     beq    .loop                ;not found
  2581.  
  2582.     move.l    d3,d1
  2583.     lea    (MyFIB,a5),a3
  2584.     move.l    a3,d2
  2585.     sys    Examine
  2586.     move.l    d0,-(sp)
  2587.     move.l    d3,d1
  2588.     sys    UnLock
  2589.     move.l    (sp)+,d0
  2590.     beq    .fail1
  2591.     moveq    #0,d5
  2592.     tst.l    (fib_DirEntryType,a3)
  2593.     bpl    .ok
  2594.  
  2595.     move.l    (dvp_Port,a4),d1        ;port
  2596.     move.l    #ACTION_FINDINPUT,d2        ;action
  2597.     move.l    d4,d5                ;arg3
  2598.     move.l    (dvp_Lock,a4),d4        ;arg2
  2599.     lea    (MyFH,a5),a0
  2600.     move.l    a0,d3
  2601.     lsr.l    #2,d3                ;arg1
  2602.     sys    DoPkt
  2603.     tst.l    d0
  2604.     beq    .fail1
  2605.     movem.l    a2/a3/a6,-(sp)
  2606.     move.l    (fib_Size,a3),d2
  2607.     movea.l    (myf_Parent,a2),a3
  2608.     lea    (myf_Name,a2),a2
  2609.     movea.l    (ExecBase,a5),a6
  2610.     bsr    CreateNewObj
  2611.     movem.l    (sp)+,a2/a3/a6
  2612.     beq.s    .fail2
  2613.     move.l    d0,d4
  2614.     add.l    d1,d4            ;arg2 (buffer)
  2615.     movea.l    d0,a2
  2616.     move.b    #$a0,(myf_Type,a2)
  2617.     move.l    (fib_Size,a3),d5    ;arg3 (size to read)
  2618.     moveq    #ACTION_READ,d2        ;action
  2619.     lea    (MyFH,a5),a0
  2620.     move.l    (fh_Arg1,a0),d3        ;arg1
  2621.     move.l    (dvp_Port,a4),d1    ;port
  2622.     sys    DoPkt
  2623.     sub.l    d0,d5
  2624.     beq    .fail2
  2625.     move.l    d1,d5            ;secondary result
  2626. .fail2    move.l    (dvp_Port,a4),d1    ;port
  2627.     move.l    #ACTION_END,d2        ;action
  2628.     sys    DoPkt
  2629. .ok    move.l    a2,d7
  2630. .fail1    move.l    d6,d1
  2631.     sys    FreeDeviceProc
  2632. .fail    move.l    d7,d0
  2633.     movem.l    (sp)+,.regs
  2634. *-----------------------------------------------------
  2635.  
  2636.     move.l    d0,(MN_SIZE,a3)        ;primary result
  2637.     move.l    d5,(MN_SIZE+4,a3)    ;secondary result
  2638.     movea.l    a3,a1
  2639.     sys    ReplyMsg
  2640.     bra    .mloop
  2641.     
  2642. .quit    movea.l    d7,a0
  2643.     sys    DeleteMsgPort
  2644.     movea.l    a3,a1
  2645.     sysj    ReplyMsg
  2646.     
  2647. *******************************************************
  2648.  
  2649. _romtag    dc.w    $4AFC
  2650.     dc.l    _romtag    ;rt_MatchTag
  2651.     dc.l    _end    ;rt_EndSkip
  2652.     dc.b    RTF_AFTERDOS    ;rt_Flags
  2653.     dc.b    37    ;rt_Version
  2654.     dc.b    0    ;rt_Type
  2655.     dc.b    -124    ;rt_Pri
  2656.     dc.l    _name    ;rt_Name
  2657.     dc.l    _id    ;rt_IdString
  2658.     dc.l    _init    ;rt_Init
  2659.  
  2660. _name    dc.b    'env-handler'
  2661. _ns=*-_name
  2662.     dc.b    0
  2663.     dc.b    '$VER: '
  2664. _id    dc.b    'HappyENV-Handler '
  2665.  
  2666.     ifnd    test
  2667.     $VER
  2668.     elseif
  2669.     dc.b    'TEST'
  2670.     endc
  2671.  
  2672.     dc.b    ' ('
  2673.     ifnd    test
  2674.     fdate
  2675.     else
  2676.     mydate
  2677.     endc
  2678.     dc.b    ')',10,13,0
  2679.  
  2680.  
  2681. _init    movem.l    a2/d6/d7,-(sp)
  2682.     moveq    #0,d7
  2683.     moveq    #DeviceNode_SIZEOF+8+13,D0
  2684.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,D1
  2685.     sys    AllocMem
  2686.     tst.l    D0
  2687.     beq    .skip
  2688.     movea.l    D0,A2
  2689.     lea    (DeviceNode_SIZEOF,a2),a1    create BCPL 'ENV' string (5 bytes)
  2690.     moveq    #3,d0
  2691.     lea    (envarc,pc),a0
  2692.     bsr    CopyChar2BSTR
  2693.     move.l    d0,(dn_Name,a2)
  2694.     lea    (DeviceNode_SIZEOF+8,a2),a1    create BCPL handler string (11 bytes)
  2695.     lea    (_name,pc),a0
  2696.     moveq    #_ns,d0
  2697.     bsr    CopyChar2BSTR
  2698.     move.l    d0,(dn_Handler,a2)
  2699.  
  2700.     IFD    rom
  2701.     moveq    #OLTAG_EXPANSION,d0
  2702.     sys    TaggedOpenLibrary
  2703.     ELSE
  2704.     lea    (_expn,pc),a1
  2705.     moveq    #37,d0
  2706.     sys    OpenLibrary
  2707.     ENDC
  2708.  
  2709.     move.l    d0,d6
  2710.     beq.b    .fail
  2711.     exg    d6,a6
  2712.     lea    (start,pc),a0
  2713.     subq.l    #4,a0
  2714.     move.l    a0,d0        ;init
  2715.  
  2716.     IFND    rom
  2717.     move.l    (a0),d1
  2718.     beq    .ns
  2719.     addq.l    #1,d1
  2720.     move.l    d1,(dn_Startup,a2)
  2721.     ENDC
  2722.  
  2723. .ns    asr.l    #2,d0
  2724.     move.l    d0,(dn_SegList,a2)
  2725.     move.w    #2000,(dn_StackSize+2,A2)
  2726.     not.l    (dn_GlobalVec,A2)    ;globvec -1
  2727.     moveq    #5,D0
  2728.     move.l    D0,(dn_Priority,a2)
  2729.     moveq    #-128,D0    ;bootpri = do not boot at all
  2730.     moveq    #0,D1
  2731.     suba.l    a1,a1
  2732.     movea.l    a2,a0
  2733.     sys    AddBootNode
  2734.     move.l    d0,d7
  2735. .fn    movea.l    a6,a1
  2736.     movea.l    d6,A6
  2737.     sys    CloseLibrary
  2738.     tst.l    d7
  2739.     bne    .skip
  2740. .fail    movea.l    a2,a1
  2741.     moveq    #DeviceNode_SIZEOF+8+13,d0
  2742.     sys    FreeMem
  2743. .skip    move.l    d7,d0
  2744.     movem.l    (sp)+,a2/d6/d7
  2745.     rts
  2746. _end
  2747.  
  2748. *******************************************************
  2749.  
  2750. *******************************************************
  2751.  
  2752. * Debug output support subroutines and strings following
  2753.  
  2754.     IFD    DEBUG
  2755.  
  2756. * Output one character
  2757. RawHook    move.l    a6,-(sp)
  2758.     move.l    4.w,a6
  2759.     jsr    _LVORawPutChar(a6)
  2760.     move.l    (sp)+,a6
  2761.     rts
  2762.  
  2763. * Wait for CTRL-C signal
  2764. wait_c:
  2765.     movem.l    d0-d1/a0-a1,-(sp)
  2766.     moveq    #0,d0
  2767.     moveq    #0,d1
  2768.     bset    #12,d1
  2769.     jsr    _LVOSetSignal(a6)
  2770.     moveq    #0,d0
  2771.     bset    #12,d0
  2772.     jsr    _LVOWait(a6)    ;wait for CTRL-C
  2773.     movem.l    (sp)+,d0-d1/a0-a1
  2774.     rts
  2775.  
  2776.     IFD    VERBOSE
  2777. txstart    dc.b    "Handler started, A5=$%lx.",10,0
  2778. txend    dc.b    "Handler ended, FileSize=%ld, TotalSize=%ld, Locks=%ld..",10,0
  2779. txcopy    dc.b    "Copyfrom=$%lx.",10,0
  2780. txpack    dc.b    "Type=%ld Arg1=$%lx Arg2=$%lx Arg3=$%lx, Task=%s.",10,0
  2781. txres    dc.b    "Result1=$%lx, Result2=%ld.",10,0
  2782. txpkt    dc.b    "  Packet=$%lx, type=%ld, res=$%lx, err=%ld.",10,0
  2783. txerr1    dc.b    "  %ld: Unknown Action.",10,0
  2784.  
  2785. txopeno    dc.b    "  Oldopen lock=$%lx.",10,0
  2786. txopenn    dc.b    "  Newopen lock=$%lx.",10,0
  2787. txcreat    dc.b    "  Created file %s=$%lx size=%ld.",10,0
  2788. txread    dc.b    "  Read %ld of %ld bytes, pos=%ld.",10,0
  2789. txwrite    dc.b    "  Wrote %ld bytes, pos=%ld, size=%ld.",10,0
  2790. txwins    dc.b    "  Inserted %ld bytes at %ld.",10,0
  2791. txchng    dc.b    "  Changed mode, pos=%ld, size=%ld.",10,0
  2792. txseek    dc.b    "  Seeked, filepos=%ld.",10,0
  2793. txdel    dc.b    "  Deleted $%lx.",10,0
  2794.  
  2795. txlock    dc.b    "  Locked %s=$%lx mode %ld.",10,0
  2796. txulock    dc.b    "  Unlocked $%lx.",10,0
  2797. txexam    dc.b    "  Examined file=$%lx.",10,0
  2798. txexnx    dc.b    "  Examined next file=$%lx.",10,0
  2799. txfnd    dc.b    "    Found %s=$%lx type=$%lx.",10,0
  2800. txentry    dc.b    "    Found entry %s.",10,0
  2801. txsplit    dc.b    "    Splitted ->%s,%s.",10,0
  2802. txfull    dc.b    "    Full name: %s.",10,0
  2803. txexp    dc.b    "    Expanded path to %s.",10,0
  2804.  
  2805. txanoti    dc.b    "  Added noti $%lx->$%lx on %s key=$%lx.",10,0
  2806. txrnoti    dc.b    "  Removed noti $%lx->$%lx.",10,0
  2807. txcnoti    dc.b    "  Checking noti on %s.",10,0
  2808. txunoti    dc.b    "    Updated noti on %s key=$%lx.",10,0
  2809. txsnoti    dc.b    "    Sent signal to %s for %s.",10,0
  2810. txmnoti    dc.b    "    Sent message $%lx to %s for %s.",10,0
  2811. txgnoti    dc.b    "    Got message $%lx.",10,0
  2812.     ENDC
  2813.  
  2814.     IFND    VERBOSE
  2815. txstart    dc.b    "Handler started, A5=$%lx.",10,0
  2816. txend    dc.b    "Handler ended, FileSize=%ld, TotalSize=%ld, Locks=%ld.",10,0
  2817. txcopy    dc.b    "Copyfrom=$%lx.",10,0
  2818. txpack    dc.b    "Type=%ld Arg1=$%lx Arg2=$%lx Arg3=$%lx, Task=%s.",10,0
  2819. txres    dc.b    "Result1=$%lx, Result2=%ld.",10,0
  2820. txpkt    dc.b    0;"  Packet=$%lx, type=%ld, res=$%lx, err=%ld.",10,0
  2821. txerr1    dc.b    "  %ld: Unknown Action.",10,0
  2822. txargs    dc.b    "Args: $%lx, $%lx, $%lx, $%lx.",10,0
  2823.  
  2824. txopeno    dc.b    "  Oldopen lock=$%lx.",10,0
  2825. txopenn    dc.b    "  Newopen lock=$%lx.",10,0
  2826. txcreat    dc.b    "  Created file %s=$%lx size=%ld.",10,0
  2827. txread    dc.b    0;"  Read %ld of %ld bytes, pos=%ld.",10,0
  2828. txwrite    dc.b    0;"  Wrote %ld bytes, pos=%ld, size=%ld.",10,0
  2829. txwins    dc.b    0;"  Inserted %ld bytes at %ld.",10,0
  2830. txchng    dc.b    0;"  Changed mode, file=$%lx, pos=%ld, size=%ld.",10,0
  2831. txsize    dc.b    0;"  Changed size, file=$%lx, oldsize=%ld, newsize=%ld.",10,0
  2832. txseek    dc.b    0;"  Seeked, filepos=%ld.",10,0
  2833. txdel    dc.b    "  Deleted $%lx.",10,0
  2834.  
  2835. txlock    dc.b    0;"  Locked %s=$%lx mode %ld.",10,0
  2836. txulock    dc.b    0;"  Unlocked $%lx.",10,0
  2837. txexam    dc.b    0;"  Examined file=$%lx.",10,0
  2838. txexan    dc.b    0;"    Examined %s.",10,0
  2839. txexnx    dc.b    0;"  Examined next file=$%lx.",10,0
  2840. txfnd    dc.b    0;"    Found %s=$%lx type=$%lx.",10,0
  2841. txentry    dc.b    0;"    Found entry %s.",10,0
  2842. txsplit    dc.b    0;"    Splitted ->%s,%s.",10,0
  2843. txfull    dc.b    0;"    Full name: %s.",10,0
  2844. txexp    dc.b    "    Expanded path to %s.",10,0
  2845.  
  2846. txanoti    dc.b    "  Added noti $%lx->$%lx on %s key=$%lx.",10,0
  2847. txrnoti    dc.b    "  Removed noti $%lx->$%lx.",10,0
  2848. txcnoti    dc.b    0;"  Checking noti on %s.",10,0
  2849. txunoti    dc.b    0;"    Updated noti on %s key=$%lx.",10,0
  2850. txsnoti    dc.b    0;"    Sent signal to %s for %s.",10,0
  2851. txmnoti    dc.b    0;"    Sent message $%lx to %s for %s.",10,0
  2852. txgnoti    dc.b    0;"    Got message $%lx.",10,0
  2853.     ENDC
  2854.  
  2855.     ENDC
  2856.